詳解 Spark 核心編程之 RDD 持久化

一、問題引出

/**
案例:對同一份數據文件分別做 WordCount 聚合操作和 Word 分組操作
期望:針對數據文件只進行一次分詞、轉換操作得到 RDD 對象,然后再對該對象分別進行聚合和分組,實現數據重用
*/
object TestRDDPersist {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[*]").setAppName("persist")val sc = new SparkContext(conf)val rdd = sc.makeRDD(List("hello world", "hello spark"))val flatRdd = rdd.flatMap(_.split(" "))val mapRdd = flatRdd.map(word => {println("@@@@@@@@@@")(word, 1)})// 聚合操作val reduceRdd = mapRdd.reduceByKey(_ + _)reduceRdd.collect().foreach(println)println("**********")// 分組操作val groupRdd = mapRdd.groupByKey()groupRdd.collect().foreach(println)}
}/**
結果:flatRdd.map過程在聚合時和分組時分別都執行了,說明針對數據文件的分詞、轉換操作被重復執行了,只有對象被重用,而數據沒有被重用
解析:1.RDD是不會存儲數據的,當某個 RDD 轉換成新的 RDD 后,該 RDD 中的數據就沒有了2.如果需要再次用到該 RDD 的數據,則需要從數據源開始重新執行到該 RDD 來獲取數據
解決:針對某個需要被重復使用的 RDD 對象在其進行下一步操作時先將數據進行緩存持久化或checkpoint,后續的其它操作從緩存持久化或checkpoint中獲取數據
*/

二、RDD Cache

/**
緩存或持久化方法:1.rdd.cache():底層調用 persist() 方法,默認是將數據保存到 JVM 堆內存中2.rdd.persist(StorageLevel):可以指定數據的保存級別
說明:1.持久化方法被調用時不會立即進行緩存,而是在觸發action算子時,數據才會被緩存在計算節點的內存中2.緩存除了用于數據重用,還可以提高容錯性
*/
object TestRDDPersist {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[*]").setAppName("persist")val sc = new SparkContext(conf)val rdd = sc.makeRDD(List("hello world", "hello spark"))val flatRdd = rdd.flatMap(_.split(" "))val mapRdd = flatRdd.map(word => {println("@@@@@@@@@@")(word, 1)})//mapRdd.cache()mapRdd.persist()// 聚合操作val reduceRdd = mapRdd.reduceByKey(_ + _)reduceRdd.collect().foreach(println)println("**********")// 分組操作val groupRdd = mapRdd.groupByKey()groupRdd.collect().foreach(println)/*結果:聚合和分組前的操作過程只執行了一遍,實現了數據重用*/}
}// 存儲級別
object StorageLevel {val NONE = new StorageLevel(false, false, false, false)val DISK_ONLY = new StorageLevel(true, false, false, false)val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2) // 副本val MEMORY_ONLY = new StorageLevel(false, true, false, true) // 內存不足丟棄數據val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)val MEMORY_AND_DISK = new StorageLevel(true, true, false, true) // 內存不足溢寫磁盤val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)val OFF_HEAP = new StorageLevel(true, true, true, false, 1)
}

三、RDD CheckPoint

/**
方法:rdd.checkpoint(),將 RDD 中間結果寫入磁盤
說明:1.對 RDD 進行 checkpoint 操作并不會馬上被執行,必須執行 Action 操作才能觸發2.checkpoint保存由于在job執行完不會被刪除,所以必須指定保存路徑,一般保存在分布式文件系統
*/
object TestRDDPersist {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[*]").setAppName("persist")val sc = new SparkContext(conf)// 指定checkpoint保存路徑sc.setCheckpointDir("checkpoint")val rdd = sc.makeRDD(List("hello world", "hello spark"))val flatRdd = rdd.flatMap(_.split(" "))val mapRdd = flatRdd.map(word => {println("@@@@@@@@@@")(word, 1)})mapRdd.checkpoint()// 聚合操作val reduceRdd = mapRdd.reduceByKey(_ + _)reduceRdd.collect().foreach(println)println("**********")// 分組操作val groupRdd = mapRdd.groupByKey()groupRdd.collect().foreach(println)/*結果:聚合和分組前的操作過程只執行了一遍,實現了數據重用*/}
}

四、緩存和檢查點區別

  • cache 和 persist 會在原有的血緣關系中添加新的依賴,一旦數據出錯可以重頭讀取數據;checkpoint 檢查點會切斷原有的血緣關系,重新建立新的血緣關系,相當于改變數據源
  • cache 是將數據臨時存儲在 JVM 堆內存中,性能較高,但安全性低,persist 可以指定存儲級別,將數據臨時存儲在磁盤文件中,涉及到 IO,性能較低,作業執行完畢后臨時文件會被刪除;checkpoint 是將數據長久地存儲分布式文件系統中,安全性較高,但涉及 IO 且會獨立開啟一個作業從數據源開始獲取數據,所以性能較低,一般在 checkpoint 前先進行 cache,當 checkpoint 時 job 只需從緩存中讀取數據即可,可以提高性能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20504.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jupyter Notebook快速搭建

Jupyter Notebook why Jupyter Notebook Jupyter Notebook 是一個開源的 Web 應用程序,允許你創建和分享包含實時代碼、方程、可視化和解釋性文本的文檔。其應用包括:數據清洗和轉換、數值模擬、統計建模、數據可視化、機器學習等等。 Jupyter Notebo…

東芝機械人電池低報警解除與機器人多旋轉數據清零

今天啟動一臺設備,觸摸屏一直顯示機器人報警(翻譯過后為電池電量低),更換電池后關機重啟后也不能消除,所以打開示教器,下面就來說說怎么解決此項問題(可以參考官方發的手冊,已手冊為主)。 一,設備 下面來看看機械手的照片與示教器的照片 四軸機械手(六軸機器人有可…

可視化大屏也在卷組件化設計了?分享一些可視化組件

hello,我是大千UI工場,這次分享一些可視化大屏的組件,供大家欣賞。(本人沒有源文件提供)

動態內存基礎實踐

文章目錄 1.new 創建堆內存對象2.delete釋放內存空間3.malloc申請內存4.free釋放malloc申請的內存空間 1.new 創建堆內存對象 2.delete釋放內存空間 3.malloc申請內存 4.free釋放malloc申請的內存空間 #include <iostream> #include <string>using namespace s…

基礎數學內容重構(后綴0個數)

今天也是參加了一下寧波大學的校賽&#xff0c;其中有一道題是求后綴0的個數&#xff0c;題意是讓我們求一下式子的后綴0個數&#xff1a; 看上去比較復雜&#xff0c;但是通過化簡我們可以知道以上式子就是求&#xff08;n 1&#xff09;&#xff01;&#xff0c;這里化簡的過…

用貪心算法計算十進制數轉二進制數(小數部分)

在上一篇博文用貪心算法計算十進制數轉二進制數&#xff08;整數部分&#xff09;-CSDN博客中&#xff0c;小編介紹了用貪心算法進行十進制整數轉化為二進制數的操作步驟&#xff0c;那么有朋友問我&#xff0c;那十進制小數轉二進制&#xff0c;可以用貪心算法來計算嗎&#x…

[C++]vector的模擬實現

下面是簡單的實現vector的功能&#xff0c;沒有涉及使用內存池等復雜算法來提高效率。 一、vector的概述 &#xff08;一&#xff09;、抽象數據類型定義 容器&#xff1a;向量&#xff08;vector&#xff09;vector是表示大小可以變化的數組的序列容器。像數組一樣&#xf…

帶你學習Mybatis之Mybatis映射文件

Mybatis映射文件 增刪改查 簡單地增刪改查 <select id"selectUser" resultType"User"> select * from user where id #{id}</select><insert id"addUser"> insert into user (name,account) values (#{name},#{account…

[sylar]后端學習:配置環境(一)

1.介紹 基于sylar大神的C高性能后端網絡框架來進行環境配置和后續學習。網站鏈接&#xff1a;sylar的Linux環境配置 2.下載 按照視頻進行下載&#xff0c;并進行下載&#xff0c;并最好還要下載一個vssh的軟件。可以直接在網上搜索即可。 sylar_環境配置&#xff0c;vssh下…

CentOS 運維常用的shell腳本

文章目錄 一、操作系統磁盤空間查看實時獲取系統運行狀態獲取cpu、內存等系統運行狀態獲取系統信息二、應用程序獲取進程運行狀態查看有多少遠程的 IP 在連接本機三、用戶管理統計當前 Linux 系統中可以登錄計算機的賬戶有多少個創建用戶四、自動化管理自動備份日志文件監控的頁…

MySQL常見操作

MySQL字符串連接 在MySQL中&#xff0c;字符串連接可以使用CONCAT()函數或雙豎線||操作符進行。下面是兩種方法的示例&#xff1a; 使用CONCAT()函數&#xff1a; CONCAT(,2001,, ABC)使用雙豎線||操作符&#xff1a; ,2001, || ABC您可以根據自己的偏好選擇其中一種方法來…

TS38.300中的切換流程(很一般)

本文根據3GPP R18 TS 38.300第9.2.3節整理 切換(Handover)是移動終端(UE)進入RRC_CONNECTED狀態后在不同服務小區(Cell)之間保持與網絡聯系唯一手段&#xff0c;期間首先通過控制面(C-Plane)進行無線測量、切換協商及觸發等&#xff1b;為此3GPP在TS38.300中定義如下。 RAN系統…

shardingsphere5 自定義分片(sharding-algorithm)算法

背景 在做分表時&#xff0c;需要自定義算法。 這里實現的算法是&#xff1a; 分表字段的 hashCode 取余。 算法 public class UserShardingAlgorithm implements StandardShardingAlgorithm<String> {public static String type "USER_SHARDING_STRATEGY"…

2024KCon大會議題招募火熱進行中

歷時1個多月我們收到了來自全國各地小伙伴們的議題投遞既有前瞻性的技術研判亦有安全領域的最新策略......感謝每一位對KCon大會傾注熱情與支持的你&#xff01; 我們也收到了不少小伙伴的私信&#xff0c;有的因為工作繁忙有的因為在緊張備戰2024網絡安全攻防演練表示原定的時…

LeetCode2542最大子序列的分數

題目描述 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;兩者長度都是 n &#xff0c;再給你一個正整數 k 。你必須從 nums1 中選一個長度為 k 的 子序列 對應的下標。 對于選擇的下標 i0 &#xff0c;i1 &#xff0c;…&#xff0c; ik - 1 &#xff0c;你的 …

監控易監測對象及指標之:全面監控LDAP服務器

隨著企業信息化建設的不斷深入&#xff0c;LDAP&#xff08;輕量級目錄訪問協議&#xff09;服務器作為重要的目錄服務組件&#xff0c;其穩定性和性能直接關系到企業業務的連續性和 效率。為了確保LDAP服務器的穩定運行和高效性能&#xff0c;對其進行全面監控顯得尤為重要。…

Kafka原生API使用Java代碼-消費者組-消費模式

文章目錄 1、消費模式1.1、創建一個3分區1副本的 主題 my_topic11.2、創建生產者 KafkaProducer11.2、創建消費者1.2.1、創建消費者 KafkaConsumer1Group1 并指定組 my_group11.2.3、創建消費者 KafkaConsumer2Group1 并指定組 my_group11.2.3、創建消費者 KafkaConsumer3Group…

算法練習第25天|491. 非遞減子序列

491. 非遞減子序列 491. 非遞減子序列https://leetcode.cn/problems/non-decreasing-subsequences/ 題目描述&#xff1a; 給你一個整數數組 nums &#xff0c;找出并返回所有該數組中不同的遞增子序列&#xff0c;遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案…

Flutter 中的 ButtonTheme 小部件:全面指南

Flutter 中的 ButtonTheme 小部件&#xff1a;全面指南 Flutter 是一個由 Google 開發的跨平臺 UI 框架&#xff0c;它提供了一系列的組件來幫助開發者構建美觀且功能豐富的應用。在 Flutter 的組件庫中&#xff0c;ButtonTheme 是一個重要的小部件&#xff0c;它允許開發者統…

Linux、Windows安裝python環境(最新版及歷史版本指定版本)-python

目錄 一、Linux環境二、windows環境最新版本下載指定版本下載 python 官網地址&#xff1a; https://www.python.org/ 一、Linux環境 以openEuler/CentOS為例 查看可安裝python源版本 dnf provides python*默認安裝新版本 dnf install -y python3. 進入python python退出p…