SparkStreaming的運行流程

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纔算完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章