YARN 運行機制分析

點擊上方“zhisheng”,選擇“設爲星標”

後臺回覆"666",獲取新資料

YARN調度運行機制

在傳統的MapReduce中, Jobtracker同時負責作業調度(將任務調度給對應的tasktracker)和任務進度管理(監控任務, 重啓失敗的或者速度比較慢的任務等). YARN中將Jobtracker的責任劃分給兩個獨立的守護進程: 資源管理器(resource manager)負責管理集羣的所有資源, 應用管理器(application master)負責管理集羣上任務的生命週期. 具體的做法是應用管理器向資源管理器提出資源需求, 以container爲單位, 然後在這些container中運行該應用相關的進程. container由運行在集羣節點上的節點管理器監控, 確保應用不會用超資源. 每個應用的實例, 亦即一個MapReduce作業都有一個自己的應用管理器.   YARN是運算資源的調度系統。運算資源包括運行程序的jar包,配置文件,CPU,內存,IO等。使用了linux的資源隔離機制cgroup實現了CPU和內存的隔離。它的運行容器叫做container。每個container中包含了一定的CPU+內存。docker,openstack等虛擬化框架都使用了cgroup。首先,客戶端啓動後獲取一個YARNRunner,它本質上是一個動態代理對象。它負責將任務提交到YARN集羣中。

先上一個整體的流程圖:

(0)Mr程序提交到客戶端所在的節點

(1)yarnrunner向Resourcemanager申請一個application。

(2)rm將該應用程序的資源路徑返回給yarnrunner
 
(3)該程序將運行所需資源提交到HDFS上

(4)程序資源提交完畢後,申請運行mrAppMaster

(5)RM將用戶的請求初始化成一個task
 
(6)其中一個NodeManager領取到task任務。
 
(7)該NodeManager創建容器Container,併產生MRAppmaster

(8)Container從HDFS上拷貝資源到本地

(9)MRAppmaster向RM
申請運行maptask容器
 
(10)RM將運行maptask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務並創建容器。

(11)MR向兩個接收到任務的NodeManager發送程序啓動腳本,這兩個NodeManager分別啓動maptask,maptask對數據分區排序。

(12)MRAppmaster向RM申請2個容器,運行reduce task。
 
(13)reduce task向maptask獲取相應分區的數據。

(14)程序運行完畢後,MR會向RM註銷自己。

YARN的重要概念:

1)yarn並不清楚用戶提交的程序的運行機制

2)yarn只提供運算資源的調度(用戶程序向yarn申請資源,yarn就負責分配資源)

3)yarn中的主管角色叫ResourceManager

4)yarn中具體提供運算資源的角色叫NodeManager

5)這樣一來,yarn其實就與運行的用戶程序完全解耦,就意味着yarn上可以運行各種類型的分佈式運算程序(mapreduce只是其中的一種),比如mapreduce、storm程序,spark程序……

6)所以,spark、storm等運算框架都可以整合在yarn上運行,只要他們各自的框架中有符合yarn規範的資源請求機制即可

7)Yarn就成爲一個通用的資源調度平臺,從此,企業中以前存在的各種運算集羣都可以整合在一個物理集羣上,提高資源利用率,方便數據共享Yarn工作機制

下面分析下提交過程:YARNRunner會去找ResourceManager,申請提交一個Application,ResourceManager會返回一個Application資源提交路徑hdfs://xxx/.staging以及job_id。YARNRunner將資源上傳到ResourceManager指定的HDFS目錄中。包含job.split,job.xml.job.jar。然後通知ResourceManager,任務提交完成了。

由於ResourceManager會接收很多程序,而計算資源是有限的。因此不能保證每個任務一提交就能運行,所以需要有一個調度機制。(調度策略包括FIFO,Fair,Capacity等。)當Job提交成功後,ResourceManager把Job封裝成一個Task。

NodeManager與ResourceManager通信時,會領取這個Task。領取到Task後,NodeManager根據Task的描述,生成任務運行的容器container。並從HDFS上把任務需要的文件下載下來,放到container的工作目錄中。啓動MRAppmaster。

MRAppmaster請求ResourceManager分配若干個Container來啓動MapTask。ResourceManager同樣將Task放入隊列中。NodeManager與ResourceManager通信時,會領取這個Task。NodeManager會分配一個容器。

然後MRAppmaster會發送啓動程序的腳本給NodeManager。MapTask就運行起來了。MRAppmaster負責監管MapTask,如果MapTask失敗了,MRAppmaster會申請再運行一個MapTask。等到MapTask運行完畢之後,輸出結果保存在container的工作目錄下面。

MRAppmaster再申請容器運行ReduceTask。ReduceTask運行起來以後,會去下載MapTask的輸出結果,每個ReduceTask獲取自己負責的那一部分。ReduceTask執行完畢後,MRAppmaster會向ResourceManager註銷自己,YARN會回收所有的計算資源。

總結

YARN現狀,YARN只負責程序運行所需要資源的分配回收等調度任務,和MapReduce程序沒有什麼耦合。所以許許多多的其他的程序也可以在YARN上運行,比如說Spark,Storm等。Hadoop中的JobTracker。Hadoop1中沒有YARN,它使用JobTracker和TaskTracker。客戶端提交任務給JobTracker,JobTracker負責啓動MapTask和ReduceTask。JobTracker知道我們的程序是怎麼運行的,即JobTracker和MR程序是緊緊耦合在一起的。JobTracker只有一個節點,要負責:資源調度 應用的運算流程管理監控所以負擔很重,如果JobTracker掛了,所有的程序都不能運行了。對比看來,明顯是YARN的架構更好。




基於 Apache Flink 的實時監控告警系統關於數據中臺的深度思考與總結(乾乾貨)日誌收集Agent,陰暗潮溼的地底世界
2020 繼續踏踏實實的做好自己

公衆號(zhisheng)裏回覆 面經、ES、Flink、 Spring、Java、Kafka、監控 等關鍵字可以查看更多關鍵字對應的文章。

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