天天看點

Spark源碼分析 – Checkpoint

1. 首先如果rdd需要cp, 調用rdd.checkpoint()來mark 

注釋說了, 這個需要在job被執行前被mark, 原因後面看, 并且最好選擇persist這個rdd, 否則在存cp檔案時需要重新computerdd内容 

并且當rdd被cp後, 所有dependencies都會被清除, 因為既然rdd已經被cp, 那麼就可以直接從檔案讀取, 沒有必要保留之前的parents的dependencies(保留隻是為了replay)

2. 在sparkcontext.runjob中, 最後會調用rdd.docheckpoint() 

如果前面已經mark過, 那麼這裡就會将rdd真正cp到檔案中去, 這也是前面為什麼說, mark必須在run job之前完成

3. 在rddcheckpointdata.docheckpoint中

會調用rdd.markcheckpointed(newrdd), 清除dependencies資訊 

并最終将狀态設為, checkpointed, 以表示完成cp

4. checkpoint如何使用, 在rdd.computeorreadcheckpoint中, 看到如果已經完成cp, 會直接從firstparent中讀資料, 剛開始會覺得比較奇怪

rdd.firstparent的定義如下, 就是從dependencies中取第一個dependency的rdd

而rdd.dependencies的定義如下, 可用看到在完成cp的情況下, 從dependencies中讀到的其實就是cp rdd, 是以可以直接用

繼續閱讀