Spark 定製版:013~Spark Streaming源碼解讀之Driver容錯安全性

本講內容:

a. ReceiverBlockTracker容錯安全性
b. DStreamGraph和JobGenerator容錯安全性

注:本講內容基於Spark 1.6.1版本(在2016年5月來說是Spark最新版本)講解。

上節回顧

上一講中,我們從安全角度來講解Spark Streaming,由於Spark Streaming會不斷的接收數據、不斷的產生job、不斷的提交job。所以數據的安全性至關重要。

首先我們來談談,對於數據安全性的考慮:

a. Spark Streaming是基於Spark Core之上的,如果能夠確保數據安全可好的話,在Spark Streaming生成Job的時候裏面是基於RDD,即使運行的時候出現問題,那麼Spark Streaming也可以藉助Spark Core的容錯機制自動容錯

b. 對於executor的安全容錯主要是數據的安全容錯。Executor計算時候的安全容錯是藉助Spark core的RDD的,所以天然是安全的

那麼Executor容錯方式是什麼呢?

a. 最簡單的容錯是副本方式,基於底層BlockManager副本容錯,也是默認的容錯方式

b. 接收到數據之後不做副本,支持數據重放,所謂重放就是支持反覆讀取數據

這裏寫圖片描述

開講

本講我們從Spark Streaming源碼解讀Driver容錯安全性:那麼什麼是Driver容錯安全性呢?

a. 從數據層面:ReceivedBlockTracker爲整個Spark Streaming應用程序記錄元數據信息

b. 從調度層面:DStreamGraph和JobGenerator是Spark Streaming調度的核心,記錄當前調度到哪一進度,和業務有關

c. 從運行角度: 作業生存層面,JobGenerator是Job調度層面

談Driver容錯性我們需要考慮Driver中有那些需要維持狀態的運行

a. ReceivedBlockTracker跟蹤了數據,因此需要容錯。通過WAL方式容錯

b. DStreamGraph表達了依賴關係,恢復狀態的時候需要根據DStream恢復計算邏輯級別的依賴關係。通過checkpoint方式容錯

c. JobGenerator表面是基於ReceiverBlockTracker中的數據,以及DStream構成的依賴關係不斷的產生Job的過程。也可以這麼理解這個過程中消費了那些數據,並且跟蹤進行到了一個怎樣的程度

具體分析如下圖:

這裏寫圖片描述

ReceivedBlockTracker

ReceivedBlockTracker會管理Spark Streaming運行過程中所有的數據。並且把數據分配給需要的batches,所有的動作都會被WAL寫入到Log中,Driver失敗的話,就可以根據歷史恢復tracker狀態,在ReceivedBlockTracker創建的時候,使用checkpoint保存歷史目錄

這裏寫圖片描述

下面我們就走進Receiver,解密在收到數據之後,有事怎麼處理的?

Receiver接收到數據,把元數據信息彙報上來,然後通過ReceiverSupervisorImpl就將數據彙報上來,就直接通過WAL進行容錯

當Receiver的管理者,ReceiverSupervisorImpl把元數據信息彙報給Driver的時候,正在處理是交給ReceiverBlockTracker. ReceiverBlockTracker將數據寫進WAL文件中,然後纔會寫進內存中,被當前的Spark Streaming程序的調度器使用的,也就是JobGenerator使用的。JobGenerator不可能直接使用WAL。WAL的數據在磁盤中,這裏JobGenerator使用的內存中緩存的數據結構

ReceiverBlockTracker.addBlock源碼

這裏寫圖片描述

此時的數據結構就是streamIdToUnallocatedBlockQueues,Driver端接收到的數據保存在streamIdToUnallocatedBlockQueues中

這裏寫圖片描述

allocateBlocksToBatch把接收到的數據但是沒有分配,分配給batch,根據streamId取出Block,由此就知道Spark Streaming處理數據的時候可以有不同的batchTime(batchTime是上一個Job分配完數據之後,開始再接收到的數據的時間

這裏寫圖片描述

timeToAllocatedBlocks可以有很多的時間窗口的Blocks,也就是Batch Duractions的Blocks。這裏面就維護了很多Batch Duractions分配的數據

這裏寫圖片描述

根據streamId獲取Block信息

這裏寫圖片描述

cleanupOldBatches:因爲時間的推移會不斷的生成RDD,RDD會不斷的處理數據,
因此不可能一直保存歷史數據

這裏寫圖片描述

writeToLog源碼

這裏寫圖片描述

總結:

WAL對數據的管理包括數據的生成,數據的銷燬和消費。上述在操作之後都要先寫入到WAL的文件中

這裏寫圖片描述

JobGenerator

Checkpoint會有時間間隔Batch Duractions,Batch執行前和執行後都會進行checkpoint

doCheckpoint被調用的前後流程

這裏寫圖片描述

generateJobs源碼

這裏寫圖片描述

processEvent接收到消息

這裏寫圖片描述

對當前的狀態進行Checkpoint

這裏寫圖片描述

DStream中的updateCheckpointData源碼(最終導致RDD的Checkpoint

這裏寫圖片描述

doCheckpoint中的shouldCheckpoint是狀態變量

這裏寫圖片描述

JobGenerator容錯安全性

這裏寫圖片描述

總結

a. ReceivedBlockTracker是通過WAL方式來進行數據容錯的。

b. DStreamGraph和JobGenerator是通過checkpoint方式來進行數據容錯的。

發佈了42 篇原創文章 · 獲贊 11 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章