Spark Streaming揭祕
checkpoint的使用
今天談下sparkstreaming中,另外一個至關重要的內容Checkpoint。
首先,我們會看下checkpoint的使用。另外,會看下在應用程序重新啓動時,是如何處理checkpoint的。
Checkpoint保存什麼
checkpoint作爲容錯的設計,基本思路是把當前運行的狀態,保存在容錯的存儲系統中(一般是hdfs)。對於容錯的處理,肯定是圍繞作業緊密相關的,保存內容包括元數據和數據兩部分。
從元數據角度講,SparkStreaming中會有哪些內容需要保存呢,主要有三類:
- 程序的配置
- 應用程序的業務邏輯,保存在DStreamGraph裏。
- 還有哪些沒有處理的數據,即沒有完成的batch。
從數據角度講下,Checkpoint是對於狀態(state)操作生效。
首先,一般情況下在接收數據並保存時,是使用WAL來容錯,這個昨天討論過,並不放在checkpoint裏。
對狀態(state)的DStream操作(updateStateByKey),操作會跨多個batch duration,後面數據對前面的有依賴,隨着時間的推移,依賴鏈條會越來越長,這個時候需要使用checkpoint,把這個長鏈條持久化,成爲短鏈條。
在官方例子RecoverableNetworkCount中,我們看到可以用如下方法創建一個可恢復的streamingContext。
那關鍵就是getOrCreate方法
裏面提供了兩種創建方式,第一次是創建新的streaming context,否則會從checkpoint數據中創建出上下文。第三個輸入參數是Hadoop的配置,一般來說checkpoint存放在hdfs中。ignoreReadError,可以控制是否拋出異常。
讓我們進入checkpoint的read方法。這裏面是循環checkpoint目錄中的文件,讀取並反序列化,之後返回。
我們看下反序列化方法,生成一個Checkpoint類型。
Checkpoint裏面包含了所有我們進行保存的內容。
使用checkpoint恢復
下面我們來看下使用checkpoint構建環境的過程。
首先,調用sparkContext.getOrCreate 來構建sparkContext。
之後是恢復DStreamGraph。
DStreamGraph的恢復過程中,關鍵是恢復所有的outputStream。
在恢復的過程中,默認是根據checkpoint文件重建RDD。
checkpoint的數據是保存在ReliableCheckpointRDD中,我們看下compute方法。可以看到,就是從checkpoint文件讀取數據。
最後,還有恢復checkpointDuration。
Checkpoint的生成
生成是在JobGenerator中觸發。
在每次生成Job後,都會觸發checkpoint的寫入事件。
doCheckpoint會寫入一個Checkpoint對象,其核心就是採用序列化技術把對象寫入磁盤。
今天對checkpoint的介紹就到這裏,對於整個機制來看,還是有些漏洞,如果目錄數據存在,但是代碼變化了,有可能出現不能讀取checkpoint裏的內容,希望後續版本能改進。