Spark streaming的執行流程


http://www.cnblogs.com/shenh062326/p/3946341.html  其實流程是從這里轉載下來的,我只是在流程敘述中做了一下的標注。 當然為了自己能記住的更清楚,我沒有直接copy而是打出來的。

 

 

1、客戶端提交作業后,啟動Driver,Driver是Spark作業的Master(也就是通過Driver來啟動Receiver,定時去啟動任務的處理,注意的是,驅動啟動任務會受前一個任務執行的影響。也就是前一個任務沒有執行完成后,是不會啟動后邊的任務的。  所以,注意你的streaming的執行時間,絕對不要超過Recive數據的時間)

2、每個作業包含多個Executor,每個Executor以線程的方式運行task,Spark Streaming至少包含一個Receiver task。(一個Executor就是一個spark進程,在yarn中就是一個container,這個大家應該知道。然后Receiver task是在driver中創建的,我理解一個Receiver是運行在一個Executor中的。然后如果想要創建多個Receiver,那么需要大概這樣做(1 to 10).map(_.createStream....),這樣就能創建10個receiver task啦。 注意這個數量當然不能超過你的結點數量啦。   還有個問題,通常使用kafka比較合適,因為kafka是stream向kafka來poll數據。而他媽的flume默認只支持pull,如果想支持poll,那需要定制sink,那真是太惡心了。)

3、Receiver接收數據后生成Block,並把BlockId匯報給Driver,然后備份到另外一個Executor上。(默認情況下接受數據是200毫秒生成一個block,我理解一個block應該是一個partition?這個還不確定,需要對照源代碼看一下;然后會把生成的Block隨機扔到不同的Executor,同時,driver去派發任務時,也會找到就近的Executor。我理解,節點中的所有executor都應該會有數據才對)

4、ReceiverTracker維護Receiver匯報的BlockId。(這個ReceiverTracker應該是維護在Driver中,Driver會根據維護的這些數據塊進行任務的派發)

5、Driver定時生成JobGenerator,根據DStream的關系生成邏輯RDD,然后創建Jobset,交給JobScheduler。

6、JobScheduler負責調度Jobset,交給DAGScheduler,DAGScheduler根據邏輯RDD,生成相應的Stages,每個stage包含一到多個task。(我記得DAGScheduler會對任務做一層優化)

7、TaskScheduler負責把task調度到Executor上,並維護task的運行狀態。

8、當tasks,stages,jobset完成后,單個batch才算完成。

 


免責聲明!

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



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