1. 程式人生 > >Spark Streaming執行流程及原始碼解析(一)

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,其中包含了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...

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

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

Spark Streaming原始碼執行流程解析

reference

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

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

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



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