Spark中RDD容錯機制Checkpoint

一:引入

持久化的侷限

Spark 在生產環境下經常會面臨transformation的RDD非常多或者具體transformation的RDD本身計算特別複雜或者耗時,這個時候就要考慮對計算結果數據的持久化:

如果把數據放在內存中,雖然是快速的,但是也是最不可靠的;

如果把數據放在磁盤上,也不是完全可靠的!例如磁盤會損壞等。

 

●問題解決

Checkpoint的產生就是爲了相對而言更加可靠的持久化數據

在Checkpoint的時候可以指定把數據放在本地,也可以是在HDFS上,這就天然的藉助了HDFS高容錯、高可靠的特徵來實現了更加可靠的數據持久化、保證數據最大程度的安全,也更進一步的實現了RDD的容錯和高可用

 

 

​​​​​​​​​​​​​​二:  使用步驟

1.調用SparkContext.setCheckpointDir("目錄")方法,設置一個容錯文件系統目錄,比如hdfs,

2.對需要進行Checkpoint的RDD調用RDD.checkpoint方法。

RDD所在job運行結束後Spark會自動啓動一個單獨的job,將數據寫入之前設置的文件系統持久化,進行高可用。

 

​​​​​​​​​​​​​​三:  操作演示

sc.setCheckpointDir("hdfs://node-01:9000/ckpdir") //設置檢查點目錄,會立即在HDFS上創建一個空目錄

val rdd1 = sc.textFile("hdfs://node-01:9000/wordcount/input/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)

rdd1.checkpoint //對rdd1進行檢查點保存

rdd1.collect //Action會真正執行checkpoint

 

四:總結

開發中如何保證數據的安全性性及讀取效率

可以對頻繁使用且重要的數據,先做持久化,再做checkpint操作

●注意

在執行數據緩存的時候,需要有對應的action算子操作,纔會真正觸發持久化操作。

在做checkpoint操作的時候,此時會先執行對應觸發action算子的rdd結果,計算完成之後Spark會再開闢一個新的job來存儲checkpointRdd的結果。

 

持久化和Checkpoint的區別

1.位置

Persist 和 Cache 只能保存在本地的磁盤和內存中(或者堆外內存--實驗中)

Checkpoint 可以保存數據到 HDFS 這類可靠的存儲上

2.Lineage(血統、依賴鏈--其實就是依賴關係)

Persist和Cache,不會丟掉RDD間的依賴鏈/依賴關係,因爲這種緩存是不可靠的,如果出現了一些錯誤(例如 Executor 宕機),需要通過回溯依賴鏈,重放計算出來

Checkpoint會斬斷依賴鏈,因爲Checkpoint會把結果保存在HDFS這類存儲中,更加的安全可靠,一般不需要回溯依賴鏈

 

3.生命週期

Cache和Persist的RDD會在程序結束後立刻被清除或者手動調用unpersist方法

CheckpointRDD在程序結束後依然存在,不會被刪除.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章