Spark作業運行架構原理解析
阿新 • • 發佈:2018-10-05
tran ges 線程 mapreduce 階段 src 關於 為什麽 完成 [TOC]
),後面則會再整理一下。
1 說明
根據之前old li
(百度高級大數據工程師)給的一張草圖重新整理,並用processon
繪圖一下,這樣就更加清晰了。需要註意的是,這裏是基於Spark 2.x
以下的版本,因為在之前,底層通信是基於AKKA ACTOR
的方式,但是之後就是使用RPC
的方式了。(最近原來是想把spark 2.x
的源碼好好閱讀一下,但是公司已有的系統都是基於spark 1.x
的,並且最近才更新到spark 1.6.3
,所以也不折騰,就把spark 1.x
的好好搞透,也不影響後面進一步的深入學習與解理,因為這些都是觸類旁通的。)
另外,這裏的原理圖是spark standalone
模式,關於其它模式(如spark on yarn
2 運行架構原理圖與解析
原理圖如下:
說明如下:
- 1.啟動
Spark
集群,其實就是通過運行spark-all.sh
腳本來啟動master
節點和worker
節點,啟動了一個個對應的master
進程和worker
進程; - 2.
worker
啟動之後,向master
進程發送註冊信息(該過程基於AKKA Actor
事件驅動模型); - 3.
worker
向master
註冊成功之後,會不斷向master
發送心跳包,監聽master
節點是否存活(該過程基於AKKA Actor事件驅動模型); - 4.
driver
向Spark
集群提交作業,通過spark-submit.sh
腳本,向master
AKKA Actor
事件驅動模型); - 5.
master
收到Driver
提交的作業請求之後,向worker
節點指派任務,其實就是讓其啟動對應的executor
進程; - 6.
worker
節點收到master
節點發來的啟動executor
進程任務,就啟動對應的executor
進程,同時向master
匯報啟動成功,處於可以接收任務的狀態; - 7.當
executor
進程啟動成功後,就像Driver
進程反向註冊,以此來告訴driver
,誰可以接收任務,執行spark
作業(該過程基於AKKA Actor
事件驅動模型); - 8.
driver
接收到註冊之後,就知道了向誰發送spark
作業,這樣在spark
executor
進程為該driver
服務; - 9.
SparkContext
重要組件運行——DAGScheduler
和TaskScheduler
,DAGScheduler
根據寬依賴將作業劃分為若幹stage
,並為每一個階段組裝一批task
組成taskset
(task
裏面就包含了序列化之後的我們編寫的spark transformation
);然後將taskset
交給TaskScheduler
,由其將任務分發給對應的executor
; - 10.
executor
進程接收到driver
發送過來的taskset
,進行反序列化,然後將這些task封裝進一個叫taskrunner
的線程中,放到本地線程池中,調度我們的作業的執行;
3 疑惑與解答
1.為什麽要向Executor發送taskset?
移動數據的成本遠遠高於移動計算,在大數據計算領域中,不管是spark
還是MapReduce
,都遵循一個原則:移動計算,不移動數據!
2.因為最終的計算都是在worker的executor上完成的,那麽driver為什麽要將spark作業提交給master而不提交給worker?
可以舉個簡單的例子來說明這個問題,假如現在集群有8 cores
、8G
內存(兩個worker
節點,資源一樣的,所以每個worker
節點為4 cores
、4G
),而提交的spark
任務需要4 cores
、6G
內存,如果要找worker
,請問哪一個worker
能搞定?顯然都不能,所以需要通過master
來進行資源的合理分配,因為此時的計算是分布式計算,而不再是過去傳統的單個節點的計算了。
Spark作業運行架構原理解析