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