您好,登錄后才能下訂單哦!
Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群資源管理系統。用戶可以將各種服務框架部署在 YARN 上,由 YARN 進行統一地管理和資源分配。
<div align="center"> <img width="600px" src="https://raw.githubusercontent.com/heibaiying/BigData-Notes/master/pictures/yarn-base.png"/> </div>
ResourceManager
通常在獨立的機器上以后臺進程的形式運行,它是整個集群資源的主要協調者和管理者。ResourceManager
負責給用戶提交的所有應用程序分配資源,它根據應用程序優先級、隊列容量、ACLs、數據位置等信息,做出決策,然后以共享的、安全的、多租戶的方式制定分配策略,調度集群資源。
NodeManager
是 YARN 集群中的每個具體節點的管理者。主要負責該節點內所有容器的生命周期的管理,監視資源和跟蹤節點健康。具體如下:
ResourceManager
注冊并定時發送心跳消息,等待 ResourceManager
的指令;Container
的生命周期,監控 Container
的資源使用情況;ApplicationMaster
的需要,在啟動 Container
之前將需要的程序及其依賴拷貝到本地。在用戶提交一個應用程序時,YARN 會啟動一個輕量級的進程 ApplicationMaster
。ApplicationMaster
負責協調來自 ResourceManager
的資源,并通過 NodeManager
監視容器內資源的使用情況,同時還負責任務的監控與容錯。具體如下:
ResourceManager
申請資源,監控申請的資源的使用情況;Container
是 YARN 中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等。當 AM 向 RM 申請資源時,RM 為 AM 返回的資源是用 Container
表示的。YARN 會為每個任務分配一個 Container
,該任務只能使用該 Container
中描述的資源。ApplicationMaster
可在 Container
內運行任何類型的任務。例如,MapReduce ApplicationMaster
請求一個容器來啟動 map 或 reduce 任務,而 Giraph ApplicationMaster
請求一個容器來運行 Giraph 任務。
<div align="center"> <img src="https://raw.githubusercontent.com/heibaiying/BigData-Notes/master/pictures/yarn工作原理簡圖.png"/> </div>
Client
提交作業到 YARN 上;
Resource Manager
選擇一個 Node Manager
,啟動一個 Container
并運行 Application Master
實例;
Application Master
根據實際需要向 Resource Manager
請求更多的 Container
資源(如果作業很小, 應用管理器會選擇在其自己的 JVM 中運行任務);
Application Master
通過獲取到的 Container
資源執行分布式計算。client 調用 job.waitForCompletion 方法,向整個集群提交 MapReduce 作業 (第 1 步) 。新的作業 ID(應用 ID) 由資源管理器分配 (第 2 步)。作業的 client 核實作業的輸出, 計算輸入的 split, 將作業的資源 (包括 Jar 包,配置文件, split 信息) 拷貝給 HDFS(第 3 步)。 最后, 通過調用資源管理器的 submitApplication() 來提交作業 (第 4 步)。
當資源管理器收到 submitApplciation() 的請求時, 就將該請求發給調度器 (scheduler), 調度器分配 container, 然后資源管理器在該 container 內啟動應用管理器進程, 由節點管理器監控 (第 5 步)。
MapReduce 作業的應用管理器是一個主類為 MRAppMaster 的 Java 應用,其通過創造一些 bookkeeping 對象來監控作業的進度, 得到任務的進度和完成報告 (第 6 步)。然后其通過分布式文件系統得到由客戶端計算好的輸入 split(第 7 步),然后為每個輸入 split 創建一個 map 任務, 根據 mapreduce.job.reduces 創建 reduce 任務對象。
如果作業很小, 應用管理器會選擇在其自己的 JVM 中運行任務。
如果不是小作業, 那么應用管理器向資源管理器請求 container 來運行所有的 map 和 reduce 任務 (第 8 步)。這些請求是通過心跳來傳輸的, 包括每個 map 任務的數據位置,比如存放輸入 split 的主機名和機架 (rack),調度器利用這些信息來調度任務,盡量將任務分配給存儲數據的節點, 或者分配給和存放輸入 split 的節點相同機架的節點。
當一個任務由資源管理器的調度器分配給一個 container 后,應用管理器通過聯系節點管理器來啟動 container(第 9 步)。任務由一個主類為 YarnChild 的 Java 應用執行, 在運行任務之前首先本地化任務需要的資源,比如作業配置,JAR 文件, 以及分布式緩存的所有文件 (第 10 步。 最后, 運行 map 或 reduce 任務 (第 11 步)。
YarnChild 運行在一個專用的 JVM 中, 但是 YARN 不支持 JVM 重用。
YARN 中的任務將其進度和狀態 (包括 counter) 返回給應用管理器, 客戶端每秒 (通 mapreduce.client.progressmonitor.pollinterval 設置) 向應用管理器請求進度更新, 展示給用戶。
除了向應用管理器請求作業進度外, 客戶端每 5 分鐘都會通過調用 waitForCompletion() 來檢查作業是否完成,時間間隔可以通過 mapreduce.client.completion.pollinterval 來設置。作業完成之后, 應用管理器和 container 會清理工作狀態, OutputCommiter 的作業清理方法也會被調用。作業的信息會被作業歷史服務器存儲以備之后用戶核查。
這里以提交 Hadoop Examples 中計算 Pi 的 MApReduce 程序為例,相關 Jar 包在 Hadoop 安裝目錄的 share/hadoop/mapreduce
目錄下:
# 提交格式: hadoop jar jar包路徑 主類名稱 主類參數
# hadoop jar hadoop-mapreduce-examples-2.6.0-cdh6.15.2.jar pi 3 3
初步掌握 Yarn 的架構及原理
更多大數據系列文章可以參見 GitHub 開源項目: 大數據入門指南
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。