Spark Streaming checkpoint概述

Spark Streaming揭祕 

checkpoint的使用

今天談下sparkstreaming中,另外一個至關重要的內容Checkpoint。
首先,我們會看下checkpoint的使用。另外,會看下在應用程序重新啓動時,是如何處理checkpoint的。

Checkpoint保存什麼

checkpoint作爲容錯的設計,基本思路是把當前運行的狀態,保存在容錯的存儲系統中(一般是hdfs)。對於容錯的處理,肯定是圍繞作業緊密相關的,保存內容包括元數據和數據兩部分。

從元數據角度講,SparkStreaming中會有哪些內容需要保存呢,主要有三類:

  1. 程序的配置
  2. 應用程序的業務邏輯,保存在DStreamGraph裏。
  3. 還有哪些沒有處理的數據,即沒有完成的batch。

從數據角度講下,Checkpoint是對於狀態(state)操作生效。
首先,一般情況下在接收數據並保存時,是使用WAL來容錯,這個昨天討論過,並不放在checkpoint裏。
對狀態(state)的DStream操作(updateStateByKey),操作會跨多個batch duration,後面數據對前面的有依賴,隨着時間的推移,依賴鏈條會越來越長,這個時候需要使用checkpoint,把這個長鏈條持久化,成爲短鏈條。

在官方例子RecoverableNetworkCount中,我們看到可以用如下方法創建一個可恢復的streamingContext。
Snip20160712_68

那關鍵就是getOrCreate方法

Snip20160712_72

裏面提供了兩種創建方式,第一次是創建新的streaming context,否則會從checkpoint數據中創建出上下文。第三個輸入參數是Hadoop的配置,一般來說checkpoint存放在hdfs中。ignoreReadError,可以控制是否拋出異常。

讓我們進入checkpoint的read方法。這裏面是循環checkpoint目錄中的文件,讀取並反序列化,之後返回。
Snip20160712_71

我們看下反序列化方法,生成一個Checkpoint類型。
Snip20160712_73

Checkpoint裏面包含了所有我們進行保存的內容。
Snip20160712_74

使用checkpoint恢復

下面我們來看下使用checkpoint構建環境的過程。

首先,調用sparkContext.getOrCreate 來構建sparkContext。
Snip20160712_75

之後是恢復DStreamGraph。
Snip20160712_76

DStreamGraph的恢復過程中,關鍵是恢復所有的outputStream。
Snip20160712_77

在恢復的過程中,默認是根據checkpoint文件重建RDD。
Snip20160712_79

checkpoint的數據是保存在ReliableCheckpointRDD中,我們看下compute方法。可以看到,就是從checkpoint文件讀取數據。
Snip20160712_80

最後,還有恢復checkpointDuration。
Snip20160712_81

Checkpoint的生成

生成是在JobGenerator中觸發。

在每次生成Job後,都會觸發checkpoint的寫入事件。

Snip20160712_83

doCheckpoint會寫入一個Checkpoint對象,其核心就是採用序列化技術把對象寫入磁盤。
Snip20160712_86

今天對checkpoint的介紹就到這裏,對於整個機制來看,還是有些漏洞,如果目錄數據存在,但是代碼變化了,有可能出現不能讀取checkpoint裏的內容,希望後續版本能改進。

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