1. 程式人生 > 程式設計 >Hadoop 系列(二)—— 叢集資源管理器 YARN

Hadoop 系列(二)—— 叢集資源管理器 YARN

一、hadoop yarn 簡介

Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的叢集資源管理系統。使用者可以將各種服務框架部署在 YARN 上,由 YARN 進行統一地管理和資源分配。

https://github.com/heibaiying

二、YARN架構

https://github.com/heibaiying

1. ResourceManager

ResourceManager 通常在獨立的機器上以後臺程式的形式執行,它是整個叢集資源的主要協調者和管理者。ResourceManager 負責給使用者提交的所有應用程式分配資源,它根據應用程式優先順序、佇列容量、ACLs、資料位置等資訊,做出決策,然後以共享的、安全的、多租戶的方式制定分配策略,排程叢集資源。

2. NodeManager

NodeManager 是 YARN 叢集中的每個具體節點的管理者。主要負責該節點內所有容器的生命週期的管理,監視資源和跟蹤節點健康。具體如下:

  • 啟動時向 ResourceManager 註冊並定時傳送心跳訊息,等待 ResourceManager 的指令;
  • 維護 Container 的生命週期,監控 Container 的資源使用情況;
  • 管理任務執行時的相關依賴,根據 ApplicationMaster 的需要,在啟動 Container 之前將需要的程式及其依賴拷貝到本地。

3. ApplicationMaster

在使用者提交一個應用程式時,YARN 會啟動一個輕量級的程式 ApplicationMaster

ApplicationMaster 負責協調來自 ResourceManager 的資源,並通過 NodeManager 監視容器內資源的使用情況,同時還負責任務的監控與容錯。具體如下:

  • 根據應用的執行狀態來決定動態計算資源需求;
  • ResourceManager 申請資源,監控申請的資源的使用情況;
  • 跟蹤任務狀態和進度,報告資源的使用情況和應用的進度資訊;
  • 負責任務的容錯。

4. Contain

Container 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等。當 AM 向 RM 申請資源時,RM 為 AM 返回的資源是用 Container

表示的。YARN 會為每個任務分配一個 Container,該任務只能使用該 Container 中描述的資源。ApplicationMaster 可在 Container 內執行任何型別的任務。例如,MapReduce ApplicationMaster 請求一個容器來啟動 map 或 reduce 任務,而 Giraph ApplicationMaster 請求一個容器來執行 Giraph 任務。

三、YARN工作原理簡述

https://github.com/heibaiying

  1. Client 提交作業到 YARN 上;

  2. Resource Manager 選擇一個 Node Manager,啟動一個 Container 並執行 Application Master 例項;

  3. Application Master 根據實際需要向 Resource Manager 請求更多的 Container 資源(如果作業很小,應用管理器會選擇在其自己的 JVM 中執行任務);

  4. Application Master 通過獲取到的 Container 資源執行分散式計算。

四、YARN工作原理詳述

https://github.com/heibaiying

1. 作業提交

client 呼叫 job.waitForCompletion 方法,向整個叢集提交 MapReduce 作業 (第 1 步) 。新的作業 ID(應用 ID) 由資源管理器分配 (第 2 步)。作業的 client 核實作業的輸出,計算輸入的 split,將作業的資源 (包括 Jar 包,配置檔案,split 資訊) 拷貝給 HDFS(第 3 步)。 最後,通過呼叫資源管理器的 submitApplication() 來提交作業 (第 4 步)。

2. 作業初始化

當資源管理器收到 submitApplciation() 的請求時,就將該請求發給排程器 (scheduler),排程器分配 container,然後資源管理器在該 container 內啟動應用管理器程式,由節點管理器監控 (第 5 步)。

MapReduce 作業的應用管理器是一個主類為 MRAppMaster 的 Java 應用,其通過創造一些 bookkeeping 物件來監控作業的進度,得到任務的進度和完成報告 (第 6 步)。然後其通過分散式檔案系統得到由客戶端計算好的輸入 split(第 7 步),然後為每個輸入 split 建立一個 map 任務,根據 mapreduce.job.reduces 建立 reduce 任務物件。

3. 任務分配

如果作業很小,應用管理器會選擇在其自己的 JVM 中執行任務。

如果不是小作業,那麼應用管理器向資源管理器請求 container 來執行所有的 map 和 reduce 任務 (第 8 步)。這些請求是通過心跳來傳輸的,包括每個 map 任務的資料位置,比如存放輸入 split 的主機名和機架 (rack),排程器利用這些資訊來排程任務,儘量將任務分配給儲存資料的節點,或者分配給和存放輸入 split 的節點相同機架的節點。

4. 任務執行

當一個任務由資源管理器的排程器分配給一個 container 後,應用管理器通過聯絡節點管理器來啟動 container(第 9 步)。任務由一個主類為 YarnChild 的 Java 應用執行, 在執行任務之前首先本地化任務需要的資源,比如作業配置,JAR 檔案,以及分散式快取的所有檔案 (第 10 步。 最後,執行 map 或 reduce 任務 (第 11 步)。

YarnChild 執行在一個專用的 JVM 中,但是 YARN 不支援 JVM 重用。

5. 進度和狀態更新

YARN 中的任務將其進度和狀態 (包括 counter) 返回給應用管理器,客戶端每秒 (通 mapreduce.client.progressmonitor.pollinterval 設定) 嚮應用管理器請求進度更新,展示給使用者。

6. 作業完成

除了嚮應用管理器請求作業進度外,客戶端每 5 分鐘都會通過呼叫 waitForCompletion() 來檢查作業是否完成,時間間隔可以通過 mapreduce.client.completion.pollinterval 來設定。作業完成之後,應用管理器和 container 會清理工作狀態, OutputCommiter 的作業清理方法也會被呼叫。作業的資訊會被作業歷史伺服器儲存以備之後使用者核查。

五、提交作業到YARN上執行

這裡以提交 Hadoop Examples 中計算 Pi 的 MApReduce 程式為例,相關 Jar 包在 Hadoop 安裝目錄的 share/hadoop/mapreduce 目錄下:

# 提交格式: hadoop jar jar包路徑 主類名稱 主類引數
# hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.15.2.jar pi 3 3
複製程式碼

參考資料

  1. 初步掌握 Yarn 的架構及原理

  2. Apache Hadoop 2.9.2 > Apache Hadoop YARN

更多大資料系列文章可以參見 GitHub 開源專案大資料入門指南