Spark學習筆記總結
03. Spark cache和checkpoint機制
1. RDD cache緩存
當持久化某個RDD后,每一個節點都將把計算的分片結果保存在內存中,並在對此RDD或衍生出的RDD進行的其他動作中重用(不需要重新計算)。這使得后續的動作變得更加迅速。RDD相關的持久化和緩存,是Spark最重要的特征之一。
val rdd = sc.textFile("hdfs://172.23.27.19:9000/wrd/wc/srcdata/").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
rdd.cache()//現在沒有緩存
rdd.collect//遇到action開始緩存
.cache()是一個transformation。在job的storage頁面也可以看到緩存信息。.unpersist(true)釋放這個資源
設置緩存方式
RDD通過persist方法設置。默認的存儲級別都是僅在內存存儲一份,Spark的存儲級別還有好多種,存儲級別在object StorageLevel中定義的。

可以設置在內存、硬盤、還有份數。
2. checkpoint容錯機制
緩存有可能丟失,或者存儲存儲於內存的數據由於內存不足而被刪除。通過基於RDD的一系列轉換,丟失的數據會被重算,由於RDD的各個Partition是相對獨立的,因此只需要計算丟失的部分即可,並不需要重算全部Partition。
但是,多次迭代后數據丟失的重新計算,會影響這個效率。因此,RDD的緩存容錯機制保證了即使緩存丟失也能保證快速的恢復,而不是重新計算。
checkpoint保存的目錄是在HDFS目錄中,保證了存儲的可靠性。
sc.setCheckpointDir("hdfs://master:9000/..")//會在..目錄創建一個文件夾
//對象面的rdd設置checkpoint
rdd.checkpoint
rdd.collect
checkpoint和cache一樣,是transformation
當遇到action時,checkpoint會啟動另一個任務,將數據切割拆分,保存到設置的checkpoint目錄中。
在Spark的checkpoint源碼中提到,
- 當使用了checkpoint后,數據被保存到HDFS,此RDD的依賴關系也會丟掉,因為數據已經持久化到硬盤,不需要重新計算。
- 強烈推薦先將數據持久化到內存中(cache操作),否則直接使用checkpoint會開啟一個計算,浪費資源。

初接觸,記下學習筆記,還有很多問題,望指導,謝謝。
