SparkCore — checkpoint機制

checkpoint的原理及其使用場景

  checkpoint是Spark提供的一個高級的功能,對於特別複雜的Spark程序而言,從一開始的RDD開始到最後結束,有很多transformation操作,並且執行時間很長,假如這時候,可能出現某個反覆使用的RDD,因爲節點故障的緣故,導致數據丟失(雖然之前持久化,但依然可能導致丟失)。這時候,由於沒有容錯機制的存在,當後面transformation操作再次使用到這個RDD的時候,會發現數據丟失,此時就會重新計算一分,導致Spark作業變慢。
  針對上述情況,就比較適用checkpoint了,它的功能就是對於複雜Spark作業,若擔心某個重要RDD丟失,那麼就可以針對這個RDD開始checkpoint機制,實現容錯和高可用,它會通過設置的一個容錯的分佈式文件系統(如HDFS),將數據寫入上面。

checkpoint原理

checkpoint運行流程
  上面是RDD checkpoint流程,如果RDD調用了checkpoint(),那麼先將該RDD狀態設置爲MarkedForCheckpoint,接着在RDD運行結束後,會調用Job最後一個RDD的doCheckpoint()方法,它沿着finalRDD的lineage,向上查找標記爲MarkedForCheckpoint的RDD,並將其標記爲CheckpointingInProgress。接着啓動一個單獨的Job將lineage中標記爲CheckpointingInProgress的RDD,進行checkpoint操作,將RDD寫入預先設置好的文件系列目錄中。RDD checkpoint之後會改變RDD的lineage,它會清楚掉RDD所有的依賴,並將父RDD設置爲CheckpointRDD,RDD的狀態變爲checkpointed。

checkpoint與持久化的區別

  有兩個主要區別:
  1、持久化是將數據保存在BlockManager(內存或磁盤),但是RDD的lineage(依賴)是不變的,但是checkpoint之後,RDD已經沒有之前的依賴了,只有一個強行爲其設置的CheckpointRDD,也就是說checkpoint之後RDD的lineage已經改變。
  2、持久化數據丟失的可能性更大,但是checkpoint通常保存在容錯的文件系統中(比如HDFS),它就不容易丟失。

checkpoint使用注意

  在使用checkpoint的時候,最好先將RDD進行持久化到磁盤(DISK_ONLY),如果RDD沒有持久化,那麼悲劇了,本來Job結束後,由於中間RDD沒有持久化,那麼checkpoint Job想要將RDD的數據寫入外部文件系統,還得將之前RDD重新計算一份,再將計算出來的RDD寫入外部文件系統,這樣效率就低了。
  因此通常建議要對checkpoint的RDD,使用persist(StorageLevel.DISK_ONLY),該RDD計算完成之後會持久化到磁盤上,之後進行checkpoint操作,就直接從磁盤上讀取RDD的數據,並checkpoint到外部的文件系統即可,這裏不建議持久化到內存,因爲內存特別容易丟失數據。

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