YARN中包括以下幾個角色:
- 客戶端(Client):向整個集群提交MapReduce作業(yè)。
- YARN資源管理器(ResourceManager):負(fù)責(zé)調(diào)度整個集群的計算資源。
- YARN節(jié)點管理器(NodeManager):在集群的機(jī)器上啟動以及監(jiān)控container。
- MapReduce應(yīng)用管理器(MRAppMaster): 調(diào)度某個作業(yè)的所有任務(wù). 應(yīng)用管理器和任務(wù)運行在container中, container由資源管理器調(diào)度, 由節(jié)點管理器管理。
- 分布式文件系統(tǒng):通常是HDFS。

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