Spark-RDD-04checkpoint容錯機制
我們瞭解到合理地將RDD持久化/快取,不僅直接避免了RDD的重複計算導致的資原浪費和佔用,還提升了RDD的容錯性,
而且間接提升了分析任務的完成效率,那麼為什麼又會需要基於checkpoint的容錯機制,在什麼情況下需要設定checkpoint呢?
對RDD進行ceckpoin操作,會將RDD直接儲存到磁碟上,而不是記憶體,從而實現真正的資料持久化。
checkpoint實際上對RDD lineage (RDD依賴關係圖譜)的輔助和重新切割修正,當RDD依賴關係過於冗長和複雜時,
即依賴關係已達數十代,多個不同的分析任務同時依賴該RDD lineage多箇中間RDD時,並且記憶體難以同時滿足快取多個相關
中間RDD時,可以考慮根據多個不同分析任務依賴的中間RDD的不同,使用checkpoint將該RDD lineage 切分成多個
子RDD lineage,這樣每一個子RDD lineage都會從各自checkpoint開始算起,從而實現了相互獨立,大大減少了由於過於冗長
的RDD lineage造成的高昂容錯成本以及記憶體資源不足問題。
RDD設定檢查點(checkpoint),checkpoint 函式將會建立一個 二進位制的檔案,並存儲到checkpoint目錄中(checkpoint 儲存的
目錄是在HDFS目錄中,天然地保證了儲存的可靠性),該目錄是用SparkContext.setCheckpoinDir()設定的。在checkpoint的
過程中,該RDD的所有依賴於父RDD中的資訊將全部被移出。對RDD進行checkpoint操作並不會馬上核執行,必須執行Action
操作才能觸發。
原始碼剖析:
(1)當使用了checkpoint後,資料被儲存到HDFS,此RDD的依賴關係也會天掉,因為資料已經持久化到硬碟,不需要重新計算,會天年掉。
(2)強烈推薦先將資料持久化到記憶體中(cache 操作),否則直接使用checkpoint 會開啟一個計算,浪費資源。為哈要這樣呢?因為checkpoint會觸發個Job,如果執行checkpoint的rdd是由其他rdd經過許多計算轉換過來的,如果你沒有持久化這個rdd,那麼又要從頭開始計算該rdd,也就是做了重複的計算工作了,所以建議先persist rdd然後再checkpoint.
(3)對涉及大量達代計算的重要階段性結果設定檢查點。checkpoint 會丟棄該rdd的以前的依賴關係,使該rdd成為頂層父rdd,這樣在失敗的時候恢復只需要恢復該rdd,而不需要重新計算該rdd了,這在達代計算中是很有用的,假設你在達代1000次的計算中在第999次失敗了,然後你沒有checkpoint,你只能重新開始恢復了,如果恰好你在第998次選代的時候做了一個checkpoint,那麼你只需要恢復第998次產生的rld,然後再執行2次迭化完成總共1000的迭代,這樣效率就很高,比較適用於選代計算非常複雜的情況。也就是說在恢復計算代價非常高的情況下,適當進行checkpoint會有很大的好處。