本系列主要描述Spark Streaming的運行流程,然后對每個流程的源碼分別進行解析
之前總聽同事說Spark源碼有多么棒,咱也不知道,就是瘋狂點頭。今天也來擼一下Spark源碼。
對Spark的使用也就是Spark Streaming使用的多一點,所以就拿Spark Streaming開涮。
源碼中的一些類
這里先列舉一些源碼中的類,大家先預熱一下。
StreamingContext:這是Spark Streaming程序的入口,提供了運行時上下文環境
DStream:是RDD在Spark Streaming中的實現,是連續的RDD(相同類型)序列,表示連續的數據流
JobScheduler:生成和調度job
DStreamGraph:保存DStream之間的依賴關系
JobGenerator:根據DStream依賴生成job
ReceiverTracker:Driver端用於管理ReceiverInputDStreams執行的管家
EventLoop:一個事件循環,用於接收來自調用方的事件並處理事件線程中的所有事件。它將啟動一個專用事件線程來處理所有事件。內部使用LinkedBlockingDeque實現。
RecurringTimer:相當於一個定時器,定時執行某個函數
ReceiverSupervisor:Executor端管理Receiver的管家
Receiver:在Executor節點上運行以接收外部數據。
InputDStream:接收外部數據
ReceiverInputDStream:用於定義必須在工作節點上啟動接收器以接收外部數據的類,可以通過它獲得Receiver
BlockGenerator:根據時間間隔將接收到的數據生成塊
RpcEndpoint:RPC終端點,Spark Streaming中使用Netty進行RPC通信
ReceiverTrackerEndpoint:Driver端的ReceiverTracker終端,用於和Receiver通信
運行流程
Spark Streaming運行時由Driver和Executor相互協調完成。
Driver端創建StreamingContext,其中包含了DStreamGraph和JobScheduler(它又包括了ReceiverTracker和JobGenerator),Driver主要負責生成調度job、與execuor進行交互、指導工作。
Eexcutor主要有ReceiverSupervisor、Receiver、BlockManager、BlockGenerator,Executor負責數據的接收和存儲、任務的執行。
以下是Spark Streaming運行架構圖,可以先大致看一下,等待會看完運行流程再回來看一遍。
從接收數據到處理完成具體可划分為以下四步:
啟動流處理引擎
創建並啟動StreamingContext對象,其中維護了DStreamGraph和JobScheduler實例。
DStreamGraph用來定義DStream,並管理他們的依賴關系。
JobScheduler用來生成和調度job,其中維護了ReceiverTracker和JobGenerator實例。
ReceiverTracker是Driver端的Receiver管理者,負責在Executor中啟動ReceiverSupervisor並與之通信,ReceiverSupervisor會啟動Receiver進行接收消息。
JobGenerator用來生成Job。
每個實例都各司其職,在啟動時都會調用其start方法,開始運轉。
接收並存儲數據
Executor端的Receiver啟動后不斷的接收消息,並調用其store()方法將數據存儲。
store方法最終會調用ReceiverSupervisorImpl.pushAndReportBlock()將數據進行存儲,並匯報給Driver端的ReceiverTrackerEndpoint。
這里有一個重要的類:BlockGenerator,其使用ArrayBuffer對接收到的單條數據進行暫存。
BlockGenerator還有一個定時器,按批處理間隔定時將ArrayBuffer中的數據封裝為Block,並將Block存到一個ArrayBlockingQueue隊列中。
BlockGenerator中還啟動了一個線程從ArrayBlockingQueue中取出Block,調用ReceiverSupervisorImpl.pushAndReportBlock()進行存儲,並與Driver端匯報。
處理數據
處理數據就是生成job、執行job。
首先在JobGenerator中維護了一個定時器,每當批處理間隔到達時,發起GenerateJobs指令,調用generateJobs生成&執行job。
generateJobs方法中會讓ReceiverTracker分配本批次對應的數據,然后讓DStreamGraph根據DStream的依賴生成job;job生成成功的話會調用submitJobSet提交執行job,然后執行job。
我們編寫的業務處理代理代碼,會在生成job時作為參數參進去。
輸出數據
job執行后會根據我們寫的代碼執行輸出。
end...
至此,就大致梳理了一下整體流程。
接下來再詳細的擼一下每一步的源碼。
reference
《圖解Spark核心技術與案例實戰》,首先推薦一下這本書,對於理解Spark有很大幫助。
https://www.cppentry.com/bencandy.php?fid=116&id=209107,這個是Spark Streaming源碼解析的系列文章,講的也很清晰
http://ddrv.cn/a/250847 Spark Streaming運行架構圖來源
個人公眾號:碼農峰,定時推送行業資訊,持續發布原創技術文章,歡迎大家關注。