1. 程式人生 > >Spark核心程式設計:RDD持久化詳解

Spark核心程式設計:RDD持久化詳解

1.RDD持久化原理

1.Spark非常重要的一個功能特性就是可以將RDD持久化在記憶體中。當對RDD執行持久化操作時,每個節點都會將自己操作的RDD的partition持久化到記憶體中,並且在之後對該RDD的反覆使用中,直接使用記憶體快取的partition。這樣的話,對於針對一個RDD反覆執行多個操作的場景,就只要對RDD計算一次即可,後面直接使用該RDD,而不需要反覆計算多次該RDD。
2.巧妙使用RDD持久化,甚至在某些場景下,可以將spark應用程式的效能提升10倍。對於迭代式演算法和快速互動式應用來說,RDD持久化,是非常重要的。
3.要持久化一個RDD,只要呼叫其cache()或者persist()方法即可。在該RDD第一次被計算出來時,就會直接快取在每個節點中。而且Spark的持久化機制還是自動容錯的

,如果持久化的RDD的任何partition丟失了,那麼Spark會自動通過其源RDD,使用transformation操作重新計算該partition。
4.cache()和persist()的區別在於,cache()是persist()的一種簡化方式,cache()的底層就是呼叫的persist()的無參版本,同時就是呼叫persist(MEMORY_ONLY),將資料持久化到記憶體中。如果需要從記憶體中清楚快取,那麼可以使用unpersist()方法。
5.Spark自己也會在shuffle操作時,進行資料的持久化,比如寫入磁碟,主要是為了在節點失敗時,避免需要重新計算整個過程。

2.持久化和不持久化的對比

1.不使用RDD持久化的問題的原理:
這裡寫圖片描述
2.RDD持久化的工作原理:
這裡寫圖片描述
3.案例:檢查第二次統計文件行數所要時間。
Java版:

// cache()或者persist()的使用,是有規則的
        // 必須在transformation或者textFile等建立了一個RDD之後,直接連續呼叫cache()或persist()才可以
        // 如果你先建立一個RDD,然後單獨另起一行執行cache()或persist()方法,是沒有用的
        // 而且,會報錯,大量的檔案會丟失
        JavaRDD<String> lines = sc.textFile
("C://Users//Administrator//Desktop//spark.txt").cache(); long beginTime = System.currentTimeMillis(); long count = lines.count(); System.out.println(count); long endTime = System.currentTimeMillis(); System.out.println("cost " + (endTime - beginTime) + " milliseconds."); beginTime = System.currentTimeMillis(); count = lines.count(); System.out.println(count); endTime = System.currentTimeMillis(); System.out.println("cost " + (endTime - beginTime) + " milliseconds.");

結果:
不持久化(沒加catch()):
第一次count:
這裡寫圖片描述
第二次count:
這裡寫圖片描述
持久化(加catch()):
第一次count:
這裡寫圖片描述
第二次count:
這裡寫圖片描述
對比可以看出,持久化後第二次count花費51毫秒,遠遠小於沒持久所花費的時間,持久化後spark的效能大幅度提高。

3.RDD持久化策略

1.RDD持久化是可以手動選擇不同的策略的。比如可以將RDD持久化在記憶體中、持久化到磁碟上、使用序列化的方式持久化,多持久化的資料進行多路複用。只要在呼叫persist()時傳入對應的StorageLevel即可。
1>MEMORY_ONLY:以非序列化的Java物件的方式持久化在JVM記憶體中。如果記憶體無法完全儲存RDD所有的partition,那麼那些沒有持久化的partition就會在下一次需要使用它的時候,重新被計算。
2>MEMORY_AND_DISK:同上,但是當某些partition無法儲存在記憶體中時,會持久化到磁碟中。下次需要使用這些partition時,需要從磁碟上讀取。
3>MEMORY_ONLY_SER:同MEMORY_ONLY,但是會使用Java序列化方式,將Java物件序列化後進行持久化。可以減少記憶體開銷,但是需要進行反序列化,因此會加大CPU開銷。
4>MEMORY_AND_DSK_SER:同MEMORY_AND_DSK。但是使用序列化方式持久化Java物件。
5>DISK_ONLY:使用非序列化Java物件的方式持久化,完全儲存到磁碟上。
6>MEMORY_ONLY_2或者MEMORY_AND_DISK_2等:如果是尾部加了2的持久化級別,表示會將持久化資料複用一份,儲存到其他節點,從而在資料丟失時,不需要再次計算,只需要使用備份資料即可。

4.選擇RDD持久化策略

1.Spark提供的多種持久化級別,主要是為了在CPU和記憶體消耗之間進行取捨。下面是一些通用的持久化級別的選擇建議:
1>優先使用MEMORY_ONLY,如果可以快取所有資料的話,那麼就使用這種策略。因為純記憶體速度最快,而且沒有序列化,不需要消耗CPU進行反序列化操作。
2>如果MEMORY_ONLY策略,無法儲存的下所有資料的話,那麼使用MEMORY_ONLY_SER,將資料進行序列化進行儲存,純記憶體操作還是非常快,只是要消耗CPU進行反序列化。
3>如果需要進行快速的失敗恢復,那麼就選擇帶字尾為_2的策略,進行資料的備份,這樣在失敗時,就不需要重新計算了。
4>能不使用DISK相關的策略,就不用使用,有的時候,從磁碟讀取資料,還不如重新計算一次。

相關推薦

Spark核心程式設計RDD持久化

1.RDD持久化原理 1.Spark非常重要的一個功能特性就是可以將RDD持久化在記憶體中。當對RDD執行持久化操作時,每個節點都會將自己操作的RDD的partition持久化到記憶體中,並且在之後對該RDD的反覆使用中,直接使用記憶體快取的partition

Spark核心程式設計RDD持久化

RDD持久化原理 Spark非常重要的一個功能特性就是可以將RDD持久化在記憶體中。當對RDD執行持久化操作時,每個節點都會將自己操作的RDD的partition持久化到記憶體中,並且在之後對該RDD的反覆使用中,直接使用記憶體快取的partition。這樣的

Spark核心程式設計建立RDD及transformation和action和案例

建立RDD 進行Spark核心程式設計時,首先要做的第一件事,就是建立一個初始的RDD。該RDD中,通常就代表和包含了Spark應用程式的輸入源資料。然後在建立了初始的RDD之後,才可以通過Spark Core提供的transformation運算元,對該RD

Spark核心程式設計建立RDD(集合、本地檔案、HDFS檔案)

1,建立RDD 1.進行Spark核心程式設計時,首先要做的第一件事,就是建立一個初始的RDD。該RDD中,通常就代表和包含了Spark應用程式的輸入源資料。然後在建立了初始的RDD之後,才可以通過Spark Core提供的transformation運算元,

Spark核心RDDSort排序

val conf = new SparkConf() val sc = new SparkContext(conf) val array = Array((1, 6, 3), (2, 3, 3), (1, 1, 2), (1, 3, 5), (2, 1, 2)) val rdd1 = sc.paralleli

Spark核心RDDfoldByKey函式

foldByKey(zeroValue: V, numPartitions: Int)(func: (V, V) => V): RDD[(K, V)]foldByKey(zeroValue: V

Spark RDD操作combineByKey函式

當資料集一鍵值對形式組織的時候,聚合具有相同鍵的元素進行一些統計是很常見的操作。對於Pair RDD常見的聚合操作如:reduceByKey,foldByKey,groupByKey,combineByKey。這裡重點要說的是combineByKey。因為combineBy

Spark筆記整理(十三)RDD持久化性能測試(圖文並茂)

才會 不執行 分享 綠色 做的 specified ffffff cto 最好 [TOC] 1 前言 其實在之前的文章《Spark筆記整理(五):Spark RDD持久化、廣播變量和累加器》中也有類似的測試,不過當時做的測試僅僅是在本地跑代碼,並以Java/Scala代碼

spark核心程式設計spark基本工作原理與RDD

Spark2.0筆記 spark核心程式設計,spark基本工作原理與RDD 1. Spark基本工作原理 2. RDD以及其特點 3. 什麼是Spark開發 1.Spark基本工作原理 2. RDD以及其特點 3. 什麼是Spark開發 spark核心程

【搞定Java併發程式設計】第8篇volatile關鍵字

上一篇:Java記憶體模型詳解:https://blog.csdn.net/pcwl1206/article/details/84871090 目  錄: 1、volatile的作用 1.1、volatile的可見性 1.2、volatile禁止指令重排序 2、vola

Linux 多工程式設計——多程序vfork() 函式

所需標頭檔案: #include <sys/types.h> #include <unistd.h> pid_t vfork(void); 功能: vfork() 函式和 fork() 函式(fork()如何使用,請點此連結)一樣都是在已有的

Spark RDD入門

1、Spark RDD概念 RDD即彈性分散式資料集,有容錯機制並可以被並行操作的元素集合,具有隻讀、分割槽、容錯、高效、無需物化、可以快取、RDD依賴等特徵。RDD只是資料集的抽象,分割槽內部並不會

【搞定Java併發程式設計】第29篇Executor 框架

上一篇:Java中的執行緒池詳解 本文目錄: 1、Executor 框架簡介 1.1、Executor 框架的兩級排程模型 1.2、Executor 框架的結構與成員 2、ThreadPoolExecutor 詳解 2.1、FixedThreadPool 2.2、Sing

Spark核心彈性分散式資料集RDD及其轉換和操作pyspark.RDD

彈性分散式資料集RDD(Resilient Distributed Dataset)術語定義l彈性分散式資料集(RDD): Resillient Distributed Dataset,Spark的基本計算單元,可以通過一系列運算元進行操作(主要有Transformation

Spark RDD使用2--RDD建立方式

RDD建立方式 1)從Hadoop檔案系統(如HDFS、Hive、HBase)輸入建立。 2)從父RDD轉換得到新RDD。 3)通過parallelize或makeRDD將單機資料建立為分散式RDD。 4)基於DB(Mysql)、NoSQL(HBase)、S3(SC3)、資

Spark入門——1RDD程式設計介面

     RDD是Spark的核心,也是整個Spark的架構基礎。spark與mapreduce相比,前者提供了更加豐富的程式設計介面給程式猿們。所以下面主要說明RDD的基本概念,以及其重要介面。 RDD包含4大操作:                1,建立操作:

windows程式設計(14)滑鼠訊息

關於滑鼠的一些細節知識: 通常,我們發訊息時,都是對一個特定的視窗,但是對於滑鼠訊息卻不然:只要滑鼠跨越視窗或者在某視窗中按下滑鼠按鍵,那麼視窗訊息處理程式就會收到滑鼠訊息,而不管該視窗是否活動或者是否擁有輸入焦點。滑鼠訊息一個有21種:10個顯示區域訊息,11個非顯示區域

Spark RDD使用1--RDD原理

RDD簡介       在叢集背後,有一個非常重要的分散式資料架構,即彈性分散式資料集(Resilient Distributed Dataset,RDD)。RDD是Spark的最基本抽象,是對分散式記憶體的抽象使用,實現了以操作本地集合的方式來操作分散式資料集的抽象實現。

Spark RDD API(一) Map和Reduce

RDD是什麼? RDD是Spark中的抽象資料結構型別,任何資料在Spark中都被表示為RDD。從程式設計的角度來看,RDD可以簡單看成是一個數組。和普通陣列的區別是,RDD中的資料是分割槽儲存的,這樣不同分割槽的資料就可以分佈在不同的機器上,同時可以被並行處理。因此,S

Spark RDD使用5--Action運算元

本質上在Actions運算元中通過SparkContext執行提交作業的runJob操作,觸發了RDD DAG的執行。  根據Action運算元的輸出空間將Action運算元進行分類:無輸出、 HDFS、 Scala集合和資料型別。 無輸出 foreach 對RDD中的每個元素