Hadoop 三劍客之 —— 叢集資源管理器 YARN

單人影發表於2019-06-30

一、hadoop yarn 簡介

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

Hadoop 三劍客之 —— 叢集資源管理器 YARN

二、YARN架構

Hadoop 三劍客之 —— 叢集資源管理器 YARN

1. ResourceManager

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

2. NodeManager

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

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

3. ApplicationMaster

在使用者提交一個應用程式時,YARN會啟動一個輕量級的程式ApplicationMasterApplicationMaster負責協調來自 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工作原理簡述

Hadoop 三劍客之 —— 叢集資源管理器 YARN
  1. Client提交作業到YARN上;

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

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

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

四、YARN工作原理詳述

Hadoop 三劍客之 —— 叢集資源管理器 YARN

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 開源專案: 大資料入門指南

相關文章