YARN中包括以下幾個角色:
- 客戶端(Client):向整個集群提交MapReduce作業(yè)舌镶。
- YARN資源管理器(ResourceManager):負責調度整個集群的計算資源爽室。
- YARN節(jié)點管理器(NodeManager):在集群的機器上啟動以及監(jiān)控container。
- MapReduce應用管理器(MRAppMaster): 調度某個作業(yè)的所有任務. 應用管理器和任務運行在container中, container由資源管理器調度, 由節(jié)點管理器管理奋姿。
- 分布式文件系統(tǒng):通常是HDFS。
1、作業(yè)提交
YARN中的提交作業(yè)的API和經(jīng)典的MapReduce很像(第1步). 作業(yè)提交的過程和經(jīng)典的MapReduce很像, 新的作業(yè)ID(應用ID)由資源管理器分配(第2步). 作業(yè)的客戶端核實作業(yè)的輸出, 計算輸入的split, 將作業(yè)的資源(包括Jar包, 配置文件, split信息)拷貝給HDFS(第3步). 最后, 通過調用資源管理器的submitApplication()來提交作業(yè)(第4步).
2煮仇、作業(yè)初始化
當資源管理器收到submitApplciation()的請求時, 就將該請求發(fā)給調度器(scheduler), 調度器分配第一個container, 然后資源管理器在該container內啟動應用管理器進程, 由節(jié)點管理器監(jiān)控(第5a和5b步).
MapReduce作業(yè)的應用管理器是一個主類為MRAppMaster的Java應用. 其通過創(chuàng)造一些bookkeeping對象來監(jiān)控作業(yè)的進度, 得到任務的進度和完成報告(第6步). 然后其通過分布式文件系統(tǒng)得到由客戶端計算好的輸入split(第7步). 然后為每個輸入split創(chuàng)建一個map任務, 根據(jù)mapreduce.job.reduces創(chuàng)建reduce任務對象.
然后應用管理器決定如何運行構成整個作業(yè)的任務. 如果作業(yè)很小, 應用管理器會選擇在其自己的JVM中運行任務, 這種作業(yè)稱作是被unerized, 或者是以uber task的方式運行. 在任務運行之前, 作業(yè)的setup方法被調用來創(chuàng)建輸出路徑. 與MapRuduce 1中該方法由tasktracker運行的一個任務調用不同, 在YARN中是由應用管理器調用的.
3嫉髓、任務分配
如果不是小作業(yè), 那么應用管理器向資源管理器請求container來運行所有的map和reduce任務(第8步). (注:每個任務對應一個container观腊,且只能在該container上運行)這些請求是通過心跳來傳輸?shù)? 包括每個map任務的數(shù)據(jù)位置, 比如存放輸入split的主機名和機架(rack). 調度器利用這些信息來調度任務, 盡量將任務分配給存儲數(shù)據(jù)的節(jié)點, 或者退而分配給和存放輸入split的節(jié)點相同機架的節(jié)點.
請求也包括了任務的內存需求, 默認情況下map和reduce任務的內存需求都是1024MB. 可以通過mapreduce.map.memory.mb和mapreduce.reduce.memory.mb來配置.
分配內存的方式和MapReduce 1中不一樣, MapReduce 1中每個tasktracker有固定數(shù)量的slot, slot是在集群配置是設置的, 每個任務運行在一個slot中, 每個slot都有最大內存限制, 這也是整個集群固定的. 這種方式很不靈活.
在YARN中, 資源劃分的粒度更細. 應用的內存需求可以介于最小內存和最大內存之間, 并且必須是最小內存的倍數(shù).
4、任務運行
當一個任務由資源管理器的調度器分配給一個container后, 應用管理器通過練習節(jié)點管理器來啟動container(第9a步和9b步). 任務有一個主類為YarnChild的Java應用執(zhí)行. 在運行任務之前首先本地化任務需要的資源, 比如作業(yè)配置, JAR文件, 以及分布式緩存的所有文件(第10步). 最后, 運行map或reduce任務(第11步).
YarnChild運行在一個專用的JVM中, 但是YARN不支持JVM重用.
5算行、進度和狀態(tài)更新
YARN中的任務將其進度和狀態(tài)(包括counter)返回給應用管理器, 后者通過每3秒的臍帶接口有整個作業(yè)的視圖(view). 這和MapRduce 1不太一樣, 后者的進度流從tasktracker到jobtracker梧油。
客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設置)向應用管理器請求進度更新, 展示給用戶。
在MapReduce 1中, jobtracker的UI有運行的任務列表及其對應的進度. 在YARN中, 資源管理器的UI展示了所有的應用以及各自的應用管理器的UI州邢。
6儡陨、作業(yè)完成
除了向應用管理器請求作業(yè)進度外, 客戶端每5分鐘都會通過調用waitForCompletion()來檢查作業(yè)是否完成. 時間間隔可以通過mapreduce.client.completion.pollinterval來設置。
作業(yè)完成之后, 應用管理器和container會清理工作狀態(tài), OutputCommiter的作業(yè)清理方法也會被調用. 作業(yè)的信息會被作業(yè)歷史服務器存儲以備之后用戶核查量淌。