Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集羣資源管理系統。用戶能夠將各類服務框架部署在 YARN 上,由 YARN 進行統一地管理和資源分配。html
<div align="center"> <img width="600px" src="https://raw.githubusercontent...;/> </div>git
ResourceManager
一般在獨立的機器上之後臺進程的形式運行,它是整個集羣資源的主要協調者和管理者。ResourceManager
負責給用戶提交的全部應用程序分配資源,它根據應用程序優先級、隊列容量、ACLs、數據位置等信息,作出決策,而後以共享的、安全的、多租戶的方式制定分配策略,調度集羣資源。github
NodeManager
是 YARN 集羣中的每一個具體節點的管理者。主要負責該節點內全部容器的生命週期的管理,監視資源和跟蹤節點健康。具體以下:shell
ResourceManager
註冊並定時發送心跳消息,等待 ResourceManager
的指令;Container
的生命週期,監控 Container
的資源使用狀況;ApplicationMaster
的須要,在啓動 Container
以前將須要的程序及其依賴拷貝到本地。在用戶提交一個應用程序時,YARN 會啓動一個輕量級的進程 ApplicationMaster
。ApplicationMaster
負責協調來自 ResourceManager
的資源,並經過 NodeManager
監視容器內資源的使用狀況,同時還負責任務的監控與容錯。具體以下:apache
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...;/> </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-cdh5.15.2.jar pi 3 3
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南