作者:周志湖
微信号:zhouzhihubeyond
spark stream 緩存
checkpoint
案例
通過前面一系列的課程介紹,我們知道dstream是由一系列的rdd構成的,它同一般的rdd一樣,也可以将流式資料持久化到内容當中,采用的同樣是persisit方法,調用該方法後dstream将持久化所有的rdd資料。這對于一些需要重複計算多次或資料需要反複被使用的dstream特别有效。像reducebywindow、reducebykeyandwindow等基于視窗操作的方法,它們預設都是有persisit操作的。reducebykeyandwindow方法源碼具體如下:
從上面的方法來看,它最傳回的是一個reducedwindoweddstream對象,跳到該類的源碼中可以看到在其主構造函數中包含下面兩段代碼:
通過上面的代碼我們可以看到,通過視窗操作産生的dstream不需要開發人員手動去調用persist方法,spark會自動幫我們将資料緩存當記憶體當中。同一般的rdd類似,dstream支援的persisit級别為:

通過前期對spark streaming的了解,我們知道,spark streaming應用程式如果不手動停止,則将一直運作下去,在實際中應用程式一般是24小時*7天不間斷運作的,是以streaming必須對諸如系統錯誤、jvm出錯等與程式邏輯無關的錯誤(failures )具體很強的彈性,具備一定的非應用程式出錯的容錯性。spark streaming的checkpoint機制便是為此設計的,它将足夠多的資訊checkpoint到某些具備容錯性的存儲系統如hdfs上,以便出錯時能夠迅速恢複。有兩種資料可以chekpoint:
(1)metadata checkpointing
将流式計算的資訊儲存到具備容錯性的存儲上如hdfs,metadata checkpointing适用于當streaming應用程式driver所在的節點出錯時能夠恢複,中繼資料包括:
configuration(配置資訊) - 建立streaming應用程式的配置資訊
dstream operations - 在streaming應用程式中定義的dstreaming操作
incomplete batches - 在列隊中沒有處理完的作業
(2)data checkpointing
将生成的rdd儲存到外部可靠的存儲當中,對于一些資料跨度為多個bactch的有狀态tranformation操作來說,checkpoint非常有必要,因為在這些transformation操作生成的rdd對前一rdd有依賴,随着時間的增加,依賴鍊可能會非常長,checkpoint機制能夠切斷依賴鍊,将中間的rdd周期性地checkpoint到可靠存儲當中,進而在出錯時可以直接從checkpoint點恢複。
具體來說,metadata checkpointing主要還是從drvier失敗中恢複,而data checkpoing用于對有狀态的transformation操作進行checkpointing
checkpointing具體的使用方式時通過下列方法:
進行了适量修改
輸入參數配置如下:
運作狀态圖如下:
首次運作時:
手動将程式停止,然後重新運作