集羣資源管理器——YARN

一、hadoop yarn 簡介

Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集羣資源管理系統。用戶可以將各種服務框架部署在 YARN 上,由 YARN 進行統一地管理和資源分配。
在這裏插入圖片描述

二、YARN架構

在這裏插入圖片描述

1. ResourceManager

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

2. NodeManager

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

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

3. ApplicationMaster

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

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

4. Container

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

三、YARN工作原理簡述

在這裏插入圖片描述

  1. Client 提交作業到 YARN 上;

  2. Resource Manager 選擇一個 Node Manager,啓動一個 Container 並運行 Application Master 實例;

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

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

四、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章