1. 程式人生 > >經典MapReduce作業和Yarn上MapReduce作業運行機制

經典MapReduce作業和Yarn上MapReduce作業運行機制

管理 cal 3.1 mapred hadoop 資源管理器 ack 計數 sched

一、經典MapReduce缺陷

二、經典MapReduce的作業運行機制

如下圖是經典MapReduce作業的工作原理:

技術分享圖片

2.1 經典MapReduce作業的實體

經典MapReduce作業運行過程包含的實體:

  • 客戶端,提交MapReduce作業。
  • JobTracker,協調作業的運行。JobTracker是一個Java應用程序,它的主類是JobTracker。
  • TaskTracker,運行作業劃分後的任務。TaskTracker是Java應用程序,它的主類是TaskTracker。
  • 分布式文件系統(一般為HDFS),用來在其他實體間共享作業文件。

2.2 經典MapReduce作業的運行過程

1. 作業提交

  • 客戶端運行MapReduce作業(步驟1)
  • 向JobTracker請求一個新的作業ID,通過調用JobTracker的getNewJobId()方法獲取(步驟2)
  • 將運行作業所需的資源(包括作業JAR文件、配置文件和計算所得的輸入分片)復制到一個以ID命名的JobTracker的文件系統中(步驟3)
  • 告知JobTracker作業準備執行,通過調用JobTracker的submitJob()方法實現(步驟4)

2. 作業初始化

  • JobTracker收到對其submitJob()方法的調用後,會把此調用放入一個內部隊列中,交由作業調度器進行調度,並對其進行初始化(步驟5)。初始化包括創建一個表示正在運行作業的對象,用於封裝任務和記錄信息,以便跟蹤任務的狀態和進程。
  • 作業調度器從共享文件系統中獲取客戶端已經計算好的輸入分片(步驟6)。為每個分片創建一個map任務,創建的reduce任務由Job的mapred.reduce.tasks屬性決定,以及新建作業創建和作業清理的任務。

3. 任務分配

  • TaskTracker定期向JobTracker發生“心跳(heartbeat)”,表名TaskTracker是否存活,同時保持兩者之間的通信(步驟7)
  • JobTracker為TaskTracker分配任務,對於map任務,jobtracker會考慮tasktracker的網絡位置,選取一個距離其輸入分片文件最近的tasktracker,對於reduce任務,jobtracker會從reduce任務列表中選取下一個來執行。

4. 任務執行

  • 從HDFS中把作業的JAR文件復制到TaskTracker所在的文件系統,實現JAR文件本地化,同時,TaskTracker將應用程序所需的全部文件從分布式緩存復制到本地磁盤(步驟8),並且為任務新建一個本地工作目錄,把JAR文件中的內容解壓到這個文件夾下,然後新建一個TaskRunner實例運行該任務。

5. 進度和狀態更新

  • 任務在運行時,對其進度(progress,即任務完成百分比)的保持跟蹤。

6. 作業完成

  • 將作業的狀態設置為“成功”,並且清空JobTracker作業的工作狀態,也指示TaskTracker清空作業的工作狀態(如刪除中間輸出)。

三、Yarn上MapReduce作業運行機制

如圖為Yarn中MapReduce作業的工作原理:

技術分享圖片

3.1 Yarn上的MapReduce作業的實體

主要包括以下幾個實體:

  • 提交MapReduce作業的客戶端
  • ResourceManager,Yarn資源管理器,負責協調集群上計算資源的分配
  • NodeManager,Yarn節點管理器,負責啟動和監視集群中機器上的計算容器(container)
  • MRAPPMaster,MapReduce應用程序MRAppMaster負責協調運行MapReduce作業的任務。它和MapReduce任務在容器中運行,這些容器由資源管理器分配並由節點管理器進行管理
  • 分布式文件系統,一般為HDFS,用來與其他實體間共享作業文件

3.2 Yarn中MapReduce作業的運行過程

1. 作業提交

  • 客戶端運行MapReduce作業(步驟1)
  • 客戶端向ResourceManager請求新的作業ID,ResourceManager收到請求後,返回一個ApplicationID(步驟2)
  • 客戶端檢查作業的的輸出說明,計算輸入分片,並將作業運行所需的資源(包括作業jar文件、配置文件和分片信息)復制到HDFS(步驟3)
  • 告知ResourceManager作業準備執行,並調用ResourceManager上的submitApplication( )方法提交作業(步驟4)

2. 作業初始化

  • 資源管理器收到應用提交請求後,便將請求傳遞給調度器Scheduler,調度器分配一個容器,然後ResourceManager在NodeManager的管理下在容器中啟動應用程序的master進程(步驟5(a)和5(b))
  • 對作業進行初始化,創建對象以保持對作業進度的跟蹤(步驟6)
  • MRAppMaster接受來自共享文件系統HDFS的在客戶端計算的輸入分片(步驟7)

3. 任務分配

  • MRAppMaster為作業中的所有map任務和reduce任務向ResourceManager請求容器(步驟8)

4. 任務執行

  • 一旦ResourceManager的調度器為任務分配了容器,MRAppMaster就通過與NodeManager通信來啟動容器(步驟9(a)和9(b))
  • 任務在運行之前,需要將任務所需的資源本地化,包括作業的配置、JAR文件和所有來自分布式緩存的文件(步驟10)
  • 運行map任務或reduce任務(步驟11)

5. 進度和狀態更新

  • 任務每三秒鐘通過umbilical接口向ApplicationMaster匯報自己的進度和狀態(包含計數器),方便ApplicationMaster隨時掌握各個任務的運行狀態。

6. 作業完成

  • 作業完成後,ApplicationMaster和任務容器清理其工作狀態,ApplicationMaster向ResourceManager註銷並關閉自己。

【參考鏈接】

[1] Asu_PC, MR1和MR2的工作原理.

[2] Tom Wbite, 《Hadoop權威指南》

經典MapReduce作業和Yarn上MapReduce作業運行機制