YARN作業提交流程剖析
YARN(MapReduce2)
Yet Another Resource Negotiator / YARN Application Resource Negotiator
對於節點數超出4000的大型集群,MapReduce1系統開始面臨著擴展性瓶頸。所以有了YARN的出現。
YARN將jobtracker的職能劃分為多個獨立的實體,從而改善了MR1面臨的擴展瓶頸問題。Jobtracker負責作業調度和任務進度監視,跟蹤任務、重啟失敗或過慢的任務和進行任務登記,例如維護計數器總數。
YARN將這兩種角色劃分為兩個獨立的守護進程:管理集群上資源使用的資源管理器(Resource Manager)和管理集群上運行任務生命周期的應用管理器(Application master)。基本思路是:應用服務器與資源管理器協商集群的計算資源:容器(containers,每個容器都有特定的內存上限),在這些容器上運行特定應用程序的進程。容器由集群節點上運行的節點管理器(NodeManager)監視,以確保應用程序使用的資源不會超過分配給它的資源。
與jobtracker不同,應用的每個實例(一個MapReduce任務)有一個專用的應用master,它運行在應用的運行期間。
YARN上的MapReduce比經典的MapReduce包括更多的實體
1. 提交MapReduce作業的客戶端
2. YARN資源管理器(ResourceManager),負責協調集群上計算資源的分配
3. YARN節點管理器(NodeManager),負責啟動和監視集群中機器上的計算容器(container)
4. MapReduce應用程序master負責協調運行MapReduce作業的任務。它和MapReduce任務在容器中運行,這些容器由資源管理器分配並由節點管理器進行管理
5. 分布式文件系統(一般為HDFS),用來與其他實體間共享作業文件
作業運行過程如圖
一、作業的提交
1. MapReduce2中的作業提交是使用與MapReduce1相同的用戶API
2. 從資源管理器獲取新的作業ID,在YARN命名法中它是一個應用程序ID
3. 作業客戶端檢查作業的輸出說明,計算輸入分片並將作業資源(包括作業JAR、配置和分片信息)復制到HDFS。
4. 通過調用資源管理器上的submitApplication方法提交作業
二、作業初始化
5. 資源管理器收到調用它的submitApplication消息後,便將請求傳遞給調度器(scheduler)。調度器分配一個容器,然後資源管理器在節點管理器的管理下在容器中啟動應用程序的master進程
6. MapReduce作業的application master是一個Java應用程序,它的主類是MRAppMaster。它對作業進行初始化:通過創建多個簿記對象以保持對作業進度的跟蹤,因為它將接受來自任務的進度和完成報告
7. 接下來master接受來自共享文件系統的在客戶端計算的輸入分片,對每一個分片創建一個map任務對象一級有mapreduce.job.reduces屬性確定的多個reduce任務對象
接下來,application master決定如何運行構成MapReduce作業的各個任務。如果作業很小,就選擇在與它同一個JVM上運行任務
相對於在一個節點上順序運行他們,判斷在新的容器中分配和運行任務的開銷大於並行運行它們的開銷時,就會發生這一情況。這不同於MapReduce1,MapReduce1從不在單個tasktracker上運行小作業。這樣的作業稱為uberized,或者作為uber任務運行。
哪些任務是小任務?默認情況下,小任務就是小於10個mapper且只有一個reducer且輸入大小小於一個HDFS塊的任務。(通過設置mapreduce.job.ubertask.maxmaps、mapreduce.job.ubertask.maxreduces和mapreduce.job.ubertask.maxbytes可以改變一個作業的上述值)。將mapreduce.job.ubertask.enable設置為false也可以完全使uber任務不可用。
在任何任務運行之前,作業的setup方法為了設置作業的Outputcommiter被調用來建立作業的輸出目錄。在MapReduce1中,它在一個由tasktracker運行的特殊任務中被調用(作業創建),而在YARN執行框架中,該方法由應用程序master直接調用。
三、任務分配
8. 如果作業不適合作為uber任務運行,那麽application master就會為該作業中的左右map任務和reduce任務向資源管理器請求容器。心跳信息的請求包括每個map任務的數據本地化信息,特別是輸入分片所在的主機和相應機架信息。調度器使用這些信息來做調度決策(像jobtracker的調度器一樣)。理想情況下,它將任務分配到數據本地化的節點,但如果不可能這樣做,調度器就會相對於非本地化的分配優先使用機架本地化的分配。
請求也為任務制定了內存需求。在默認情況下,map任務和reduce任務都分配到1024MB的內存,但這可以通過mapreduce.map.memory.mb和mapreduce.reduce.memory.mb來設置。
內存的分配方式不同於MapReduce1,MapReduce1中tasktrackers有在集群配置時設置的固定數量的槽,每個任務在一個槽上運行。槽有最大內存分配限制,這對集群是固定的,導致當任務使用較少內存時無法充分利用內存(因為其他等待的任務不能使用這些未使用的內存)以及由於任務不能獲取足夠內存而導致作業失敗。
在YARN中,資源分為更細的粒度,所以可以避免上述問題。應用程序可以請求最小到最大限制範圍的任意最小值倍數的內存容量。默認的內存分配容量是調度器特定的,對於容量調度器,它的默認值最小值是1024MB(由yarn.scheduler.capacity.minimum-allocation-mb設置),默認的最大值是10240MB(由yarn.scheduler.capacity.maximum-allocation-mb設置)。因此,任務可以通過適當設置mapreduce.map.memory.mb和mapreduce.reduce.memory.mb來請求1GB到10GB間的任意1GB倍數的內存容量(調度器在需要的時候使用最接近的倍數)
四、任務執行
9. 一旦資源管理器的調度器(scheduler)為任務分配了容器,application master就通過與節點管理器通信來啟動容器(container)
10. 該任務由主類為YarnChild的Java應用程序執行。在它運行任務之前,首先將任務需要的資源本地化,包括作業的配置、JAR文件和所有來自分布式緩存的文件
11. 運行map任務和reduce任務
五、進度和狀態更新
在YARN下運行時,任務每三秒通過umbilical接口向application master匯報進度和狀態(包含計數器),作為作業的匯聚試圖(aggregate view),如下圖。MapReduce1通過tasktracker到jobtracker來實現進度更新。
客戶端每秒鐘(通過mapreduce.client.progressmonitor.pollinterval設置)查詢一次application master以接收進度更新,通常都會向用戶顯示。
在MapReduce1中,作業跟蹤器的Web UI展示運行作業列表及其進度。在YARN中,資源管理器的Web UI展示了正在運行的應用以及連接到的對應application master,每個application master展示MapReduce作業的進度等進一步的細節。
六、作業完成
除了向application master查詢進度外,客戶端每5秒鐘還通過調用Job的waitForCompletion來檢查作業是否完成。查詢的間隔可以通過mapreduce.client.completion.pollinterval屬性進行設置。
作業完成後,application master和任務容器清理其工作狀態,OutputCommiter的作業清理方法會被調用。作業歷史服務器保存作業的信息供用戶需要時查詢。
YARN作業提交流程剖析