什么是Checkpointing
Checkpointing可以將RDD從其依賴關(guān)系中抽出來捉偏,保存到可靠的存儲系統(tǒng)(例如HDFS盐欺,S3等), 即它可以將數(shù)據(jù)和元數(shù)據(jù)保存到檢查指向目錄中。 因此柏靶,在程序發(fā)生崩潰的時候,Spark可以恢復(fù)此數(shù)據(jù)溃论,并從停止的任何地方開始屎蜓。
Checkpointing分為兩類:
- reliable,容錯性優(yōu)先钥勋。這種類型的檢查點(diǎn)可確保數(shù)據(jù)永久存儲炬转,如在HDFS或其他分布式文件系統(tǒng)上。 這也意味著數(shù)據(jù)通常會在網(wǎng)絡(luò)中復(fù)制算灸,這會降低檢查點(diǎn)的運(yùn)行速度
- local扼劈,性能優(yōu)先。 RDD持久保存到執(zhí)行程序中的本地存儲菲驴。 因此荐吵,數(shù)據(jù)寫得更快,但本地存儲也不是完全可靠的赊瞬,一旦數(shù)據(jù)丟失先煎,工作將無法恢復(fù)。==一般用于需要定期截取且擁有較長的lineage關(guān)系的RDD==巧涧,例如薯蝎,GraphX。
開發(fā)人員可以是來 ==RDD.checkpoint()== 方法來設(shè)置檢查點(diǎn)谤绳。
在使用檢查點(diǎn)之前占锯,必須使用 SparkContext.setCheckpointDir(directory: String) 方法設(shè)置檢查點(diǎn)目錄。
<font color=darkb><b>Checkpointing waits until the end of a job, and launches another job to finish checkpoint. An RDD which needs to be checkpointed will be computed twice; thus it is suggested to do a rdd.cache() before rdd.checkpoint().
強(qiáng)烈建議在啟用RDD檢查點(diǎn)之前闷供,先將其persist到內(nèi)存中烟央,否則,在它存到文件之前歪脏,需要重新計(jì)算一次疑俭。
為什么使用Checkpointing
RDD的檢查點(diǎn)機(jī)制就好比Hadoop將中間計(jì)算值存儲到磁盤,即使計(jì)算中出現(xiàn)了故障婿失,我們也可以輕松地從中恢復(fù)钞艇。通過對 RDD 啟動檢查點(diǎn)機(jī)制可以實(shí)現(xiàn)容錯和高可用啄寡。
在Spark Streaming程序中,如果某些數(shù)據(jù)已經(jīng)在隊(duì)列中等待處理哩照,由于某些原因我們的應(yīng)用程序崩潰挺物,當(dāng)我們再次啟動時,則無需再次讀取這些數(shù)據(jù)飘弧,并且數(shù)據(jù)不會丟失识藤。
如果我們的應(yīng)用程序正在使用任何有狀態(tài)操作,那么檢查點(diǎn)是必需的次伶,否則一旦應(yīng)用程序崩潰痴昧,所有狀態(tài)都將丟失。
哪些RDD需要使用Checkpointing
- 計(jì)算需要很長時間
- 計(jì)算鏈太長了
- 依賴于于太多的父RDD
Checkpointing和Cache的區(qū)別
Cache和Checkpointing之間存在顯著差異冠王。Cache可以物理化RDD并將其保留在內(nèi)存(和/或磁盤)中赶撰。但是它會==記住RDD的依賴關(guān)系(lineage)==,因此就算存在節(jié)點(diǎn)故障導(dǎo)致部分緩存的RDD丟失柱彻,它們可以被重新生成豪娜。
Checkpointing僅將RDD數(shù)據(jù)保存到HDFS文件中,而==忽略依賴關(guān)系==哟楷。
此外瘤载,rdd.persist(StorageLevel.DISK_ONLY)也與checkpoint不同。通過前者可以將RDD分區(qū)持久化到磁盤吓蘑,分區(qū)由blockManager管理惕虑。一旦驅(qū)動程序完成坟冲,這意味著CoarseGrainedExecutorBackend所在的線程停止磨镶,blockManager將停止,緩存到磁盤的RDD將被刪除(blockManager使用的本地文件將被刪除)健提。但檢查點(diǎn)會將RDD保留到HDFS或本地目錄琳猫。如果沒有手動刪除,它們將始終位于磁盤上私痹,因此下一個驅(qū)動程序可以使用它們脐嫂。
參考資料
cache and checkpoint
Checkpointing in Spark
Apache Spark: Caching and Checkpointing Under the Hood
Spark RDD Checkpointing