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

1、hadoop yarn 簡介

Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集羣資源管理系統。用戶能夠將各類服務框架部署在 YARN 上,由 YARN 進行統一地管理和資源分配。html

<div align="center"> <img width="600px" src="https://raw.githubusercontent...;/> </div>git

2、YARN架構

https://github.com/heibaiying

1. ResourceManager

ResourceManager 一般在獨立的機器上之後臺進程的形式運行,它是整個集羣資源的主要協調者和管理者。ResourceManager 負責給用戶提交的全部應用程序分配資源,它根據應用程序優先級、隊列容量、ACLs、數據位置等信息,作出決策,而後以共享的、安全的、多租戶的方式制定分配策略,調度集羣資源。github

2. NodeManager

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

  • 啓動時向 ResourceManager 註冊並定時發送心跳消息,等待 ResourceManager 的指令;
  • 維護 Container 的生命週期,監控 Container 的資源使用狀況;
  • 管理任務運行時的相關依賴,根據 ApplicationMaster 的須要,在啓動 Container 以前將須要的程序及其依賴拷貝到本地。

3. ApplicationMaster

在用戶提交一個應用程序時,YARN 會啓動一個輕量級的進程 ApplicationMasterApplicationMaster 負責協調來自 ResourceManager 的資源,並經過 NodeManager 監視容器內資源的使用狀況,同時還負責任務的監控與容錯。具體以下:apache

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

4. Contain

Container 是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等。當 AM 向 RM 申請資源時,RM 爲 AM 返回的資源是用 Container 表示的。YARN 會爲每一個任務分配一個 Container,該任務只能使用該 Container 中描述的資源。ApplicationMaster 可在 Container 內運行任何類型的任務。例如,MapReduce ApplicationMaster 請求一個容器來啓動 map 或 reduce 任務,而 Giraph ApplicationMaster 請求一個容器來運行 Giraph 任務。緩存

3、YARN工做原理簡述

<div align="center"> <img src="https://raw.githubusercontent...;/> </div>安全

  1. Client 提交做業到 YARN 上;
  2. Resource Manager 選擇一個 Node Manager,啓動一個 Container 並運行 Application Master 實例;
  3. Application Master 根據實際須要向 Resource Manager 請求更多的 Container 資源(若是做業很小, 應用管理器會選擇在其本身的 JVM 中運行任務);
  4. Application Master 經過獲取到的 Container 資源執行分佈式計算。

4、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 的做業清理方法也會被調用。做業的信息會被做業歷史服務器存儲以備以後用戶覈查。

5、提交做業到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 開源項目大數據入門指南
相關文章
相關標籤/搜索