Spark Streaming運行流程及源碼解析(一)


本系列主要描述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,其中包含了DStreamGraphJobScheduler(它又包括了ReceiverTrackerJobGenerator),Driver主要負責生成調度job、與execuor進行交互、指導工作。

Eexcutor主要有ReceiverSupervisorReceiverBlockManagerBlockGenerator,Executor負責數據的接收和存儲、任務的執行。

以下是Spark Streaming運行架構圖,可以先大致看一下,等待會看完運行流程再回來看一遍。
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...

至此,就大致梳理了一下整體流程。

接下來再詳細的擼一下每一步的源碼。

Spark Streaming源碼運行流程解析

reference

《圖解Spark核心技術與案例實戰》,首先推薦一下這本書,對於理解Spark有很大幫助。

https://www.cppentry.com/bencandy.php?fid=116&id=209107,這個是Spark Streaming源碼解析的系列文章,講的也很清晰

http://ddrv.cn/a/250847 Spark Streaming運行架構圖來源



個人公眾號:碼農峰,定時推送行業資訊,持續發布原創技術文章,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM