【轉】簡易剖析Hadoop做業工做機制

原文地址:https://www.cnblogs.com/duma/p/10666269.html

建議:結合第四版Hadoop權威指南閱讀,更有利於理解

運行機制

運行一個 MR 程序主要涉及如下 5 個部分:html

  • 客戶端: 提交 MR 做業,也就是咱們運行 hadoop jar xxx 的命令後,啓動的 Java 程序
  • YARN ResourceManager: YARN 集羣主節點,負責協調集羣上計算資源的分配
  • YARN NodeManager:YARN 集羣從節點,負責啓動和監視機器上的容器(container)
  • MapReduce Application Master:負責協調  MR 做業,固然 Spark 做業也有對應的 application master

運行 MR 任務的工做原理以下圖,本圖摘自《Hadoop 權威指南(第四版)》:
緩存

 

步驟1 是咱們在客戶端節點(集羣中的某臺機器)執行 hadoop jar xxx 命令後,啓動 MR 做業的流程,後續會涉及如下幾個重要流程網絡

  • 做業的提交和初始化
  • 任務的分配與執行
  • 進度和狀態的更新

下面會詳細介紹每一個流程。這裏咱們將編寫的整個 MR 程序叫作做業,MR做業運行後的 map 或 reduce 任務統稱爲任務。app

任務的提交和初始化

做業的提交

  • 向 ResourceManager 申請一個新的應用 ID(步驟 2),以前的 MR 例子咱們能夠看到,應用 ID 的形式爲:application_1551593879638_0009
  • 計算做業分片檢查做業的輸入輸出,若輸入文件不可分割或者輸入路徑不存在,報錯返回;若是沒有指定輸出路徑或者輸出路徑已存在,報錯返回
  • 將做業運行所需的資源(jar、配置文件和分片信息等)複製到共享文件系統中(步驟 3),默認爲 HDFS 。目錄名稱以應用 ID 命名
  • 調用 ResourceManager 的 submitApplication() 方法提交做業(步驟4)

以上的流程均在客戶端節點完成。分佈式

做業的初始化

ResourceManager 收到調用它的 submitApplication() 方法後,會在 NodeManager 中分配一個 container (步驟 5a),在 container 中啓動 application master(步驟 5b) 。MapReduce application master 的主類是 MRAppMaster。application master 完成初始化後(步驟 6),從共享文件系統(如:HDFS)獲取分片信息(步驟 7)。對每一個分片建立一個 map 任務和 reduce 任務,並分配任務 ID。若是 application master 判斷該任務不是 uber 任務,那麼接下來會進行任務分配。oop

任務分配與運行

任務分配

application master 會爲 map 任務和 reduce 任務向 ResourceManager 申請分配資源。map 任務的優先級高於 reduce 任務,且直到 5% 的 map 任務完成時,reduce 任務請求才能發出。reduce 任務能夠在集羣的任意機器執行,但 map 任務有數據本地化的限制,理想狀況下數據分片和 map 任務在同一節點運行,即數據本地化(data local),這樣 map 任務直接讀取本地的數據,不須要網絡 IO。若是達不到理想狀況,能夠在數據節點同一機架上啓動 map 任務,即機架本地化(rack local),這樣 map 任務從同機架上其餘節點將數據拷貝到本身的節點。最差的狀況是分片和 map 任務不在同一機架,須要跨機架拷貝數據。application master 申請的資源包括內存和 CPU 核心數,申請的大小能夠經過 4 個屬性指定:spa

  • mapreduce.map.memory.mb:map 任務內存, 單位:MB,默認:1024
  • mapreduce.map.cpu.vcores:map 任務 CPU 核心數,默認:1
  • mapreduce.reduce.memory.mb:reduce 任務內存,單位:MB,默認:1024
  • mapreduce.reduce.cpu.vcores:reduce 任務 CPU 核心數,默認:1

任務執行

ResourceManager 爲任務在某個 NodeManager 上分配容器後(步驟 9a),application master 會與該 NodeManager 通訊來啓動容器(步驟 9b)。該任務的主類爲 YarnChild,該任務運行前會先將共享文件系統(如:HDFS)上的文件本地化(步驟 10),文件包括:配置文件、JAR包和分佈式緩存文件。最後,運行 map 或 reduce 任務(步驟 11)。htm

進度和狀態更新

當用戶成功提交而且做業成功運行後,用戶但願可以看到做業的運行狀態。一個做業和它的每一個任務都有一個狀態,包括:做業或任務的狀態(好比,運行中、成功或失敗),map 或 reduce 任務的進度以及計數器值等。blog

  • 當 map 或 reduce 任務運行時,經過接口向本身的 application master 上報進度和狀態
  • 做業的運行期間,客戶端請求 application master 以得到最新的狀態

流程圖以下:接口

 

做業的完成

application master 接到最後一個任務成功完成的通知後,便把做業置位成功得狀態。能夠端查詢到任務成功完成後,從 waitCompletion() 方法返回。做業的統計信息和計數器值輸出在控制檯。最後,application master 會作一些清理工做,做業信息由 JobHistoryServer 存檔,以便用戶之後查詢。

小結

本章主要介紹 MR 做業的運行機制,而且瞭解了 YARN 集羣主從節點職責及其相互之間的配合。經過這篇文章的介紹但願讀者對 MR 做業的運行機制有大體的瞭解。咱們能夠簡單總結下本章介紹的相關組件的做用。本文主要參考《Hadoop 權威指南(第四版)》和 Hadoop 官方文檔,有興趣的讀者能夠深刻研究,一塊兒探討。

相關文章
相關標籤/搜索