1. 程式人生 > >MapReduce作業執行機制

MapReduce作業執行機制

MapReduce作業執行機制

總結自Hadoop權威指南一書

作業執行機制中涉及到的實體

  • 客戶端:主要任務是提交作業,下簡稱CLI
  • YARN資源管理器:負責協調叢集資源,即ResourceManager,下簡稱RM
  • YARN節點管理器:負責啟動和監視機器上的計算容器,即NodeManager,下簡稱NM
  • Mapreduce的Application master:負責協調執行MapReduce任務,其和應用運行於容器中,容器由ResourceManager分配,並由NodeManager管理。下簡稱AM
  • 分散式檔案系統:共享作業檔案

作業執行

Job例項呼叫submit()方法後。submit()內部會呼叫waitForCompletion()

作業提交

  • CLI提交作業
  • CLI向RM請求一個新應用ID作為MR作業ID。
  • 檢查作業輸出說明。若未指定輸出目錄或輸出目錄已經存在,則作業不提交,拋回異常至MR作業
  • 計算作業輸入分片,若計算失敗,則回拋異常。
  • 將執行作業所需資源存至以ID命名的檔案系統中。其中作業JAR會儲存多份副本。
  • CLI呼叫RM的submitApplication()方法提交作業

作業的初始化

  • YARN 排程器分配一個容器
  • RM在NM管理下在容器中啟動AM程序
  • AM初始化MR作業
  • AM判斷該作業的執行方式。如果AM判斷在新的容器中分配和執行任務的開銷大於並行執行他們的開銷是很小,就選擇與自己在同一個JVM上執行作業,然後從共享檔案系統為每一個分片建立map任務,建立reduce任務物件,然後分配任務ID。這樣的作業稱為uberized,或作為uber作業執行1
  • 若作業不是uber作業,則進行任務分配,詳見任務的分配
  • AM設定OutputCommitter,預設為FileOutputCommitter,表示將建立作業的最終輸出目錄及任務輸出的臨時工作空間。

作業的分配

  • AM為所有map任務和reduce任務向RM請求容器。請求時先為map任務請求,在5%的map任務完成後為reduce任務請求2
  • RM為任務分配一個特定節點上的容器。

任務的執行

  • AM與NM(所分配節點的NM,可能於AM位於同一節點也可能不同)通訊,由NM啟動容器。
  • 本地化執行所需要的資源,包含作業配置,JAR檔案等
  • 執行map或reduce任務。由主類YarnChild執行。3

streaming作業的執行

  • java程序(屬於hadoop)將輸入鍵值傳遞給外部程序4
  • 外部程序執行完處理邏輯將輸出鍵值傳遞給java程序

任務進度及狀態的更新

進度

  • 對於map任務而言,任務進度是其已處理輸入所佔的比例。
  • reduce比較複雜,其進度包含reducer 三部分,與shuffle的三個階段相對應。5

狀態

  • 一個作業和他的每個任務都有一個狀態,包含作業或任務的狀態,map和reduce的進度,作業計數器的值,狀態訊息或狀態描述。
  • 任務計數器要麼內置於框架(比如輸出後統計map個數),要麼使用者自定義。
  • 子程序向任務AM報告每隔3s報告進度和狀態,由AM形成匯聚檢視。
  • 在作業期間,CLI每秒輪詢一次AM以接受最新狀態,也可以通過Job.getStatus方法得到JobStatus例項,後者包含作業全部作業資訊。

作業的完成

  • 當AM收到作業最後一個作業完成後,將作業狀態置為成成功。
  • CLI輪詢得知作業成果
  • Job列印訊息通知使用者。
  • AM和任務容器清理其工作狀態
  • 存檔作業歷史伺服器資訊

  1. 小作業即作業是小於10個Map且只有一個Reduce且輸入大小小於一個HDFS塊的作業,啟動小作業必須明確確認。 ↩︎

  2. 分配任務時,map具有資料本地化限制,reduce可在節點任意位置執行。前者優先順序高於後者。 ↩︎

  3. 每個任務皆有搭建(setup)及提交(commit),由OutputCommitter確定,對於基於檔案的作業,提交動作將任務輸出由臨時位置搬遷至最終位置。 ↩︎

  4. 指MR實現邏輯,可能有各種語言實現 ↩︎

  5. 例如任務已經執行reducer一半的輸入,則其進度為5/6,因為已經完成shuffle複製及排序階段(每個1/3),並且完成reduce階段的一半(1/6),其進度為5/6。 ↩︎