大數據技術 - MapReduce 做業的運行機制

前幾章咱們介紹了 Hadoop 的 MapReduce 和 HDFS 兩大組件,內容比較基礎,看完後能夠寫簡單的 MR 應用程序,也可以用命令行或 Java API 操做 HDFS。但要對 Hadoop 作深刻的瞭解,顯然不夠用。所以本章就深刻了解一下 MapReduce 應用的運行機制,從而學習 Hadoop 各個組件之間如何配合完成 MR 做業。本章是基於 Hadoop YARN 框架介紹,YARN(Yet Another Resource Negotiator)是 Hadoop 的集羣資源管理器,也是 Hadoop2 的默認資源管理器。爲何要用 YARN 框架? 簡單來講 Hadoop1 的時候沒有資源管理器,所以在 Hadoop1 集羣只能運行 MR 做業。YARN 出現後統一管理集羣的資源,所以 Spark、Storm 等其餘分佈式計算框架也能運行在 Hadoop 集羣。同理,除了 YARN 還有其餘的資源管理框架,目前比較火的是 k8s。緩存

運行機制

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

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

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

 

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

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

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

任務的提交和初始化

做業的提交

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

以上的流程均在客戶端節點完成。oop

做業的初始化

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

任務分配與運行

任務分配

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)。命令行

進度和狀態更新

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

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

流程圖以下:

 

做業的完成

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

小結

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

相關文章
相關標籤/搜索