MapReduce提交job到Yarn的流程學習

引言

以MapReduce爲例,提交一個MapReduce application的大致流程如下,其中Resource Manager簡寫爲RM,Node Manager簡寫爲NM,Application Master簡寫爲AM。

Top↑

提交application大致流程

(1)首先client裏執行一個MapReduce程序,這個程序運行在client端的JVM裏,在main方法中最後有一個job.waitForCompletion(true)方法,當執行這個方法後會觸發job.submitJob方法,準備向RM提交一個application。

(2)RM接受到請求後,會爲這個application生成一個application +id編號,並且檢查輸出路徑是否已存在,輸入輸出路徑信息是否齊全。不管檢查有問題與否,都會給client端返回信息,其包括運行這個job所需要的資源,如運行在哪個NM上,需要的container信息。

(3)如果返回的信息提示路徑已存在,或者job運行的參數不夠,會退出程序,否則可以繼續執行這個job,這個時候client端會將程序的jar包,以及運行所需配置信息,以及分片信息發送到HDFS(這些文件保存的上級目錄即前面生成的application+id編號,默認會拷貝10份,如果只有3個節點則多餘的7份會刪除),讓jar包和配置信息等保存在各個datanode上,這對分佈式集羣計算拉取資源來說是有利的,比直接從client端拉取資源會更加高效。

(4)前面準備沒問題後,client端向RM提交這個application。RM收到提交後,調度器scheduler將會爲它分配container資源,application manager將創建application master。

(5)RM在接受到application提交後,根據資源調度算法計算的結果(包括運行job所在的節點在哪,運行所需要的資源container是多少),會先在計算得到的某個NM上啓動一個container,用於啓動AM,這個AM是運行MapReduce job前的準備,它啓動後後續請求資源就在client端和AM之間進行了。

(6)在客戶端執行一個MapReduce程序時,能看到Map和Reduce任務執行的進度百分比,這個是AM在執行initialize job後創建的薄記對象完成的,這個薄記對象會收集運行在分佈式各個節點上任務的進度,彙總後定時發送給client。

(7)在執行MapReduce程序時,會先執行Map任務然後再執行Reduce任務(默認是執行Map任務5%後再執行Reduce任務),其中Map任務的個數是由分片數決定的,即通過InputFormat的getSplit方法得到的分片數,這個分片的信息需要從HDFS獲取,裏面保存的是指向實際分片信息的引用。而Reduce任務的個數則是程序中指定的,通過setNumReduces(num)來指定。

(8)以Map task爲例,準備執行Map task時,AM會向RM繼續發送請求,即resource request,請求獲取計算的NM和container信息。

(9)得到返回信息後,AM會在指定的NM上啓動container,並準備執行task程序。

(10)執行task程序部分,是在一個叫做Yarn Child的主類java application中進行的,這個類在執行task程序之前,會向HDFS獲取jar包和配置信息。

(11)在獲取到HDFS的jar包和配置信息後就開始運行task,如果是map task則輸出的key-value對會保存到各自的分區中去,如果是Reduce task則會從對應的map分區中拉取數據準備進行合併、排序和分組,最後執行reduce分組計算並輸出到HDFS。不管是Map task還是Reduce Task其都會向AM上報執行情況。

(12)最後執行完MapReduce任務後,保存在分區中的Map輸出信息將刪除,此外保存在HDFS中的jar包信息、配置信息和分片信息也將刪除。

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