Yarn組件、SparkOnYarn

Yarn是主從架構
Yarn的四大組件:ResourceManager、ApplicationMaster、NodeManager、Container
ResourceManager:運行在Master上的一個進程,負責集羣的資源調度
NodeManager:運行在Slaver上的一個進程,負責向Master上報子節點的運行、資源狀況。
ApplicationMaster:運行在Slaver上,是Yarn暴露給我們的客戶端,需要將我們的程序封裝到ApplicationMaster中,纔可以與ResourceManager進行溝通。
Container:運行在Slaver上,是集羣資源分配的單位

這裏寫圖片描述
如上圖所示:從我們的客戶端Client開始,Client向ResourceManager索要資源時,首先會在集羣中找一個Container爲Client封裝好的東西起一個ApplicationMaster,之後就與Client無關了,ApplicationMaster將Client註冊到ResourceManager,並與之溝通,請求資源。ApplicationMaster收到來自ResourceManager的資源列表後,就會通知相應的NodeManager啓動資源,而NodeManager便會爲之啓動Container,隨後ApplicationMaster就會將Task發送至這些Container運行,運行結束後,結果又會送回至ApplicationMaster

如下爲SparkOnYarn的例子:
這裏寫圖片描述
1:Spark客戶端提交請求,向ResourceManager申請資源
2、3:ResourceManager在集羣中的某個NodeManager中找一個Container,將Spark程序封裝爲APPMaster並啓動
4:針對Spark來說,APPMaster裏啓動的其實就是Driver裏的DAGScheduler和TaskScheduler(圖中的YarnClusterScheduler)
5、6、7:APPMaster向ResourceManager申請資源(Container),得到資源列表後,通知NodeManager啓動Container,(圖中第6步有些問題,應該是APPMaster通知NodeManager啓動Container的不是ResourceManager)
8、9:Spark的TaskScheduler最終將從HDFS中讀取的數據轉化爲Tasks,並分配給Worker上的Executor,來執行。而這裏的Executor是放在Container中執行的,所以就有一個問題:如果Container的資源大小小於Executor所需該怎麼辦?這時Executor就無法放在Container中執行了,但是此時任務不會失敗,而是會進入重試等待的狀態,當有機器的Container大小滿足時該Executor的需求時,Yarn便會分配給該Executor
last:Executor中的計算結果最終再送回至TaskScheduler中。

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