Spark:RDD checkpoint容錯機制

 

經過上一節的學習,我們瞭解到合理地將RDD持久化/緩存,不僅直接避免了RDD的重複計算導致的資源浪費和佔用還提升了RDD的容錯性,而且間接提升了分析任務的完成效率,那麼爲什麼又會需要基於checkpoint的容錯機制,在什麼情況下需要設置checkpoint呢?

對RDD進行checkpoint操作,會將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.setCheckpointDir() 設置的。在checkpoint的過程中,該RDD的所有依賴於父RDD中的信息將全部被移出。對RDD進行checkpoint操作並不會馬上被執行,必須執行Action操作才能觸發。
 

sc. setCheckpointDir ("hdfs://master:9000/..") //會在指定目錄創建一個文件夾
//對指定rdd設置checkpoint
rdd.checkpoint  // rdd尚未存儲到checkpoint目錄中
rdd.collect  //遇到action操作才真正開始計算該RDD並存儲到checkpoint目錄中


checkpoint和cache一樣, 是轉化操作當遇到行動操作時,checkpoint 會啓動另一個任務,將數據切割拆分,保存到設置的checkpoint目錄中。

在Spark的checkpoint源碼中提到:

(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次產生的rdd,然後再執行2次迭代完成總共1000的迭代,這樣效率就很高,比較適用於迭代計算非常複雜的情況。也就是說在恢復計算代價非常高的情況下,適當進行checkpoint會有很大的好處。

 

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