一、YARN 初識(shí)
Apache Hadoop YARN 是開源 Hadoop 分布式處理框架中的資源管理和作業(yè)調(diào)度技術(shù)。作為 Apache Hadoop 的核心組件之一,YARN 負(fù)責(zé)將系統(tǒng)資源分配給在 Hadoop 集群中運(yùn)行的各種應(yīng)用程序,并調(diào)度要在不同集群節(jié)點(diǎn)上執(zhí)行的任務(wù)。
YARN 的基本思想是將資源管理和作業(yè)調(diào)度/監(jiān)視的功能分解為單獨(dú)的 daemon(守護(hù)進(jìn)程),其擁有一個(gè)全局 ResourceManager(RM) 和每個(gè)應(yīng)用程序的 ApplicationMaster(AM)。應(yīng)用程序可以是單個(gè)作業(yè),也可以是作業(yè)的 DAG。
ResourceManager和 NodeManager構(gòu)成了數(shù)據(jù)計(jì)算框架。 ResourceManager 是在系統(tǒng)中的所有應(yīng)用程序之間仲裁資源的最終權(quán)限。NodeManager 是每臺(tái)機(jī)器框架代理,負(fù)責(zé) Containers,監(jiān)視其資源使用情況(CPU,內(nèi)存,磁盤,網(wǎng)絡(luò))并將其報(bào)告給 ResourceManager。
每個(gè)應(yīng)用程序 ApplicationMaster 實(shí)際上是一個(gè)框架特定的庫,其任務(wù)是協(xié)調(diào)來自 ResourceManager 的資源,并與 NodeManager 一起執(zhí)行和監(jiān)視任務(wù)。
[圖片上傳失敗...(image-767f76-1538235943456)]
在 YARN 體系結(jié)構(gòu)中,ResourceManager 作為守護(hù)程序運(yùn)行,作為架構(gòu)中的全局的 master 角色,通常在專用計(jì)算機(jī)上運(yùn)行,它在各種競(jìng)爭(zhēng)應(yīng)用程序之間仲裁可用的群集資源。ResourceManager 跟蹤群集上可用的活動(dòng)節(jié)點(diǎn)和資源的數(shù)量,并協(xié)調(diào)用戶提交的應(yīng)用程序應(yīng)獲取哪些資源以及事件。ResourceManager 是具有此信息的單個(gè)進(jìn)程,因此它可以以共享,安全和多租戶的方式進(jìn)行調(diào)度決策(例如,根據(jù)應(yīng)用程序優(yōu)先級(jí),隊(duì)列容量,ACL,數(shù)據(jù)位置等)。
當(dāng)用戶提交應(yīng)用程序時(shí),將啟動(dòng)名為 ApplicationMaster 的輕量級(jí)進(jìn)程實(shí)例,以協(xié)調(diào)應(yīng)用程序中所有任務(wù)的執(zhí)行。這包括監(jiān)視任務(wù),重新啟動(dòng)失敗的任務(wù),推測(cè)性地運(yùn)行慢速任務(wù)以及計(jì)算應(yīng)用程序計(jì)數(shù)器的總值。ApplicationMaster 和屬于其應(yīng)用程序的任務(wù)在 NodeManagers 控制的資源容器中運(yùn)行。
NodeManager 有許多動(dòng)態(tài)創(chuàng)建的資源容器。容器的大小取決于它包含的資源量,例如內(nèi)存、CPU、磁盤和網(wǎng)絡(luò)IO。目前,僅支持內(nèi)存和CPU。節(jié)點(diǎn)上的容器數(shù)是配置參數(shù)和用于守護(hù)程序及OS的資源之外的節(jié)點(diǎn)資源總量(例如總CPU和總內(nèi)存)的乘積。
ApplicationMaster 可以在容器內(nèi)運(yùn)行任何類型的任務(wù)。例如,MapReduce ApplicationMaster 請(qǐng)求容器啟動(dòng) map 或 reduce 任務(wù),而 Giraph ApplicationMaster 請(qǐng)求容器運(yùn)行 Giraph 任務(wù)。您還可以實(shí)現(xiàn)運(yùn)行特定任務(wù)的自定義 ApplicationMaster
在 YARN 中,MapReduce 簡單地降級(jí)為分布式應(yīng)用程序的角色(但仍然是非常流行且有用的),現(xiàn)在稱為MRv2。
此外,YARN 通過 ReservationSystem 支持資源預(yù)留的概念,ReservationSystem 允許用戶通過配置文件來指定資源的時(shí)間和時(shí)間約束(例如,截止日期)的,并保留資源以確保重要作業(yè)的可預(yù)測(cè)執(zhí)行。ReservationSystem 可跟蹤資源超時(shí),執(zhí)行預(yù)留的準(zhǔn)入控制,并動(dòng)態(tài)指示基礎(chǔ)調(diào)度程序確保預(yù)留已滿。
二、YARN 基本服務(wù)組件
YARN 總體上是 master/slave 結(jié)構(gòu),在整個(gè)資源管理框架中,ResourceManager 為 master,NodeManager 是 slave。
YARN的基本組成結(jié)構(gòu),YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等幾個(gè)組件構(gòu)成。
- ResourceManager是Master上一個(gè)獨(dú)立運(yùn)行的進(jìn)程,負(fù)責(zé)集群統(tǒng)一的資源管理、調(diào)度、分配等等;
- NodeManager是Slave上一個(gè)獨(dú)立運(yùn)行的進(jìn)程,負(fù)責(zé)上報(bào)節(jié)點(diǎn)的狀態(tài);
- ApplicationMaster相當(dāng)于這個(gè)Application的監(jiān)護(hù)人和管理者,負(fù)責(zé)監(jiān)控、管理這個(gè)Application的所有Attempt在cluster中各個(gè)節(jié)點(diǎn)上的具體運(yùn)行,同時(shí)負(fù)責(zé)向Yarn ResourceManager申請(qǐng)資源、返還資源等;
- Container是yarn中分配資源的一個(gè)單位,包涵內(nèi)存、CPU等等資源,YARN以Container為單位分配資源;
ResourceManager 負(fù)責(zé)對(duì)各個(gè) NadeManager 上資源進(jìn)行統(tǒng)一管理和調(diào)度。當(dāng)用戶提交一個(gè)應(yīng)用程序時(shí),需要提供一個(gè)用以跟蹤和管理這個(gè)程序的 ApplicationMaster,它負(fù)責(zé)向 ResourceManager 申請(qǐng)資源,并要求 NodeManger 啟動(dòng)可以占用一定資源的任務(wù)。由于不同的 ApplicationMaster 被分布到不同的節(jié)點(diǎn)上,因此它們之間不會(huì)相互影響。

Client 向 ResourceManager 提交的每一個(gè)應(yīng)用程序都必須有一個(gè) ApplicationMaster,它經(jīng)過 ResourceManager 分配資源后,運(yùn)行于某一個(gè) Slave 節(jié)點(diǎn)的 Container 中,具體做事情的 Task,同樣也運(yùn)行與某一個(gè) Slave 節(jié)點(diǎn)的 Container 中。
2.1 ResourceManager
RM是一個(gè)全局的資源管理器,集群只有一個(gè),負(fù)責(zé)整個(gè)系統(tǒng)的資源管理和分配,包括處理客戶端請(qǐng)求、啟動(dòng)/監(jiān)控 ApplicationMaster、監(jiān)控 NodeManager、資源的分配與調(diào)度。它主要由兩個(gè)組件構(gòu)成:調(diào)度器(Scheduler)和應(yīng)用程序管理器(Applications Manager,ASM)。
(1) 調(diào)度器
調(diào)度器根據(jù)容量、隊(duì)列等限制條件(如每個(gè)隊(duì)列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個(gè)正在運(yùn)行的應(yīng)用程序。需要注意的是,該調(diào)度器是一個(gè)“純調(diào)度器”,它從事任何與具體應(yīng)用程序相關(guān)的工作,比如不負(fù)責(zé)監(jiān)控或者跟蹤應(yīng)用的執(zhí)行狀態(tài)等,也不負(fù)責(zé)重新啟動(dòng)因應(yīng)用執(zhí)行失敗或者硬件故障而產(chǎn)生的失敗任務(wù),這些均交由應(yīng)用程序相關(guān)的ApplicationMaster完成。
調(diào)度器僅根據(jù)各個(gè)應(yīng)用程序的資源需求進(jìn)行資源分配,而資源分配單位用一個(gè)抽象概念“資源容器”(Resource Container,簡稱Container)表示,Container是一個(gè)動(dòng)態(tài)資源分配單位,它將內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等資源封裝在一起,從而限定每個(gè)任務(wù)使用的資源量。
(2) 應(yīng)用程序管理器
應(yīng)用程序管理器主要負(fù)責(zé)管理整個(gè)系統(tǒng)中所有應(yīng)用程序,接收job的提交請(qǐng)求,為應(yīng)用分配第一個(gè) Container 來運(yùn)行 ApplicationMaster,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動(dòng) ApplicationMaster、監(jiān)控 ApplicationMaster 運(yùn)行狀態(tài)并在失敗時(shí)重新啟動(dòng)它等。
2.2 ApplicationMaster
管理 YARN 內(nèi)運(yùn)行的一個(gè)應(yīng)用程序的每個(gè)實(shí)例。關(guān)于 job 或應(yīng)用的管理都是由 ApplicationMaster 進(jìn)程負(fù)責(zé)的,Yarn 允許我們以為自己的應(yīng)用開發(fā) ApplicationMaster。
功能:
- 數(shù)據(jù)切分;
- 為應(yīng)用程序申請(qǐng)資源并進(jìn)一步分配給內(nèi)部任務(wù)(TASK);
- 任務(wù)監(jiān)控與容錯(cuò);
- 負(fù)責(zé)協(xié)調(diào)來自ResourceManager的資源,并通過NodeManager監(jiān)視容易的執(zhí)行和資源使用情況。
可以說,ApplicationMaster 與 ResourceManager 之間的通信是整個(gè) Yarn 應(yīng)用從提交到運(yùn)行的最核心部分,是 Yarn 對(duì)整個(gè)集群進(jìn)行動(dòng)態(tài)資源管理的根本步驟,Yarn 的動(dòng)態(tài)性,就是來源于多個(gè)Application 的 ApplicationMaster 動(dòng)態(tài)地和 ResourceManager 進(jìn)行溝通,不斷地申請(qǐng)、釋放、再申請(qǐng)、再釋放資源的過程。
2.3 NodeManager
NodeManager 整個(gè)集群有多個(gè),負(fù)責(zé)每個(gè)節(jié)點(diǎn)上的資源和使用。
NodeManager 是一個(gè) slave 服務(wù):它負(fù)責(zé)接收 ResourceManager 的資源分配請(qǐng)求,分配具體的 Container 給應(yīng)用。同時(shí),它還負(fù)責(zé)監(jiān)控并報(bào)告 Container 使用信息給 ResourceManager。通過和ResourceManager 配合,NodeManager 負(fù)責(zé)整個(gè) Hadoop 集群中的資源分配工作。
功能:NodeManager 本節(jié)點(diǎn)上的資源使用情況和各個(gè) Container 的運(yùn)行狀態(tài)(cpu和內(nèi)存等資源)
- 接收及處理來自 ResourceManager 的命令請(qǐng)求,分配 Container 給應(yīng)用的某個(gè)任務(wù);
- 定時(shí)地向RM匯報(bào)以確保整個(gè)集群平穩(wěn)運(yùn)行,RM 通過收集每個(gè) NodeManager 的報(bào)告信息來追蹤整個(gè)集群健康狀態(tài)的,而 NodeManager 負(fù)責(zé)監(jiān)控自身的健康狀態(tài);
- 處理來自 ApplicationMaster 的請(qǐng)求;
- 管理著所在節(jié)點(diǎn)每個(gè) Container 的生命周期;
- 管理每個(gè)節(jié)點(diǎn)上的日志;
- 執(zhí)行 Yarn 上面應(yīng)用的一些額外的服務(wù),比如 MapReduce 的 shuffle 過程;
當(dāng)一個(gè)節(jié)點(diǎn)啟動(dòng)時(shí),它會(huì)向 ResourceManager 進(jìn)行注冊(cè)并告知 ResourceManager 自己有多少資源可用。在運(yùn)行期,通過 NodeManager 和 ResourceManager 協(xié)同工作,這些信息會(huì)不斷被更新并保障整個(gè)集群發(fā)揮出最佳狀態(tài)。
NodeManager 只負(fù)責(zé)管理自身的 Container,它并不知道運(yùn)行在它上面應(yīng)用的信息。負(fù)責(zé)管理應(yīng)用信息的組件是 ApplicationMaster
2.4 Container
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 中描述的資源。
Container 和集群節(jié)點(diǎn)的關(guān)系是:一個(gè)節(jié)點(diǎn)會(huì)運(yùn)行多個(gè) Container,但一個(gè) Container 不會(huì)跨節(jié)點(diǎn)。任何一個(gè) job 或 application 必須運(yùn)行在一個(gè)或多個(gè) Container 中,在 Yarn 框架中,ResourceManager 只負(fù)責(zé)告訴 ApplicationMaster 哪些 Containers 可以用,ApplicationMaster 還需要去找 NodeManager 請(qǐng)求分配具體的 Container。
需要注意的是,Container 是一個(gè)動(dòng)態(tài)資源劃分單位,是根據(jù)應(yīng)用程序的需求動(dòng)態(tài)生成的。目前為止,YARN 僅支持 CPU 和內(nèi)存兩種資源,且使用了輕量級(jí)資源隔離機(jī)制 Cgroups 進(jìn)行資源隔離。
功能:
- 對(duì)task環(huán)境的抽象;
- 描述一系列信息;
- 任務(wù)運(yùn)行資源的集合(cpu、內(nèi)存、io等);
- 任務(wù)運(yùn)行環(huán)境
三、YARN 應(yīng)用提交過程
Application在Yarn中的執(zhí)行過程,整個(gè)執(zhí)行過程可以總結(jié)為三步:
- 應(yīng)用程序提交
- 啟動(dòng)應(yīng)用的ApplicationMaster實(shí)例
- ApplicationMaster 實(shí)例管理應(yīng)用程序的執(zhí)行

具體提交過程為:
- 客戶端程序向 ResourceManager 提交應(yīng)用并請(qǐng)求一個(gè) ApplicationMaster 實(shí)例;
- ResourceManager 找到一個(gè)可以運(yùn)行一個(gè) Container 的 NodeManager,并在這個(gè) Container 中啟動(dòng) ApplicationMaster 實(shí)例;
- ApplicationMaster 向 ResourceManager 進(jìn)行注冊(cè),注冊(cè)之后客戶端就可以查詢 ResourceManager 獲得自己 ApplicationMaster 的詳細(xì)信息,以后就可以和自己的 ApplicationMaster 直接交互了(這個(gè)時(shí)候,客戶端主動(dòng)和 ApplicationMaster 交流,應(yīng)用先向 ApplicationMaster 發(fā)送一個(gè)滿足自己需求的資源請(qǐng)求);
- 在平常的操作過程中,ApplicationMaster 根據(jù)
resource-request協(xié)議向 ResourceManager 發(fā)送resource-request請(qǐng)求; - 當(dāng) Container 被成功分配后,ApplicationMaster 通過向 NodeManager 發(fā)送
container-launch-specification信息來啟動(dòng)Container,container-launch-specification信息包含了能夠讓Container 和 ApplicationMaster 交流所需要的資料; - 應(yīng)用程序的代碼以 task 形式在啟動(dòng)的 Container 中運(yùn)行,并把運(yùn)行的進(jìn)度、狀態(tài)等信息通過
application-specific協(xié)議發(fā)送給ApplicationMaster; - 在應(yīng)用程序運(yùn)行期間,提交應(yīng)用的客戶端主動(dòng)和 ApplicationMaster 交流獲得應(yīng)用的運(yùn)行狀態(tài)、進(jìn)度更新等信息,交流協(xié)議也是
application-specific協(xié)議; - 一旦應(yīng)用程序執(zhí)行完成并且所有相關(guān)工作也已經(jīng)完成,ApplicationMaster 向 ResourceManager 取消注冊(cè)然后關(guān)閉,用到所有的 Container 也歸還給系統(tǒng)。
精簡版的:

- 步驟1:用戶將應(yīng)用程序提交到 ResourceManager 上;
- 步驟2:ResourceManager 為應(yīng)用程序 ApplicationMaster 申請(qǐng)資源,并與某個(gè) NodeManager 通信啟動(dòng)第一個(gè) Container,以啟動(dòng)ApplicationMaster;
- 步驟3:ApplicationMaster 與 ResourceManager 注冊(cè)進(jìn)行通信,為內(nèi)部要執(zhí)行的任務(wù)申請(qǐng)資源,一旦得到資源后,將于 NodeManager 通信,以啟動(dòng)對(duì)應(yīng)的 Task;
- 步驟4:所有任務(wù)運(yùn)行完成后,ApplicationMaster 向 ResourceManager 注銷,整個(gè)應(yīng)用程序運(yùn)行結(jié)束。
四、Resource Request 及 Container
Yarn的設(shè)計(jì)目標(biāo)就是允許我們的各種應(yīng)用以共享、安全、多租戶的形式使用整個(gè)集群。并且,為了保證集群資源調(diào)度和數(shù)據(jù)訪問的高效性,Yarn還必須能夠感知整個(gè)集群拓?fù)浣Y(jié)構(gòu)。
為了實(shí)現(xiàn)這些目標(biāo),ResourceManager的調(diào)度器Scheduler為應(yīng)用程序的資源請(qǐng)求定義了一些靈活的協(xié)議,通過它就可以對(duì)運(yùn)行在集群中的各個(gè)應(yīng)用做更好的調(diào)度,因此,這就誕生了Resource Request和Container。
一個(gè)應(yīng)用先向ApplicationMaster發(fā)送一個(gè)滿足自己需求的資源請(qǐng)求,然后ApplicationMaster把這個(gè)資源請(qǐng)求以resource-request的形式發(fā)送給ResourceManager的Scheduler,Scheduler再在這個(gè)原始的resource-request中返回分配到的資源描述Container。
每個(gè)ResourceRequest可看做一個(gè)可序列化Java對(duì)象,包含的字段信息如下:
<resource-name, priority, resource-requirement, number-of-containers>
- resource-name:資源名稱,現(xiàn)階段指的是資源所在的host和rack,后期可能還會(huì)支持虛擬機(jī)或者更復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)
- priority:資源的優(yōu)先級(jí)
- resource-requirement:資源的具體需求,現(xiàn)階段指內(nèi)存和cpu需求的數(shù)量
- number-of-containers:滿足需求的Container的集合
ApplicationMaster在得到這些Containers后,還需要與分配Container所在機(jī)器上的NodeManager交互來啟動(dòng)Container并運(yùn)行相關(guān)任務(wù)。當(dāng)然Container的分配是需要認(rèn)證的,以防止ApplicationMaster自己去請(qǐng)求集群資源。
五、YARN 配置
a). 修改文件 YARN 配置文件
etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
b). 啟動(dòng) ResourceManager 和 NodeManager sbin/start-yarn.sh,停止 RM 和 NM sbin/stop-yarn.sh
c). 驗(yàn)證:可通過 JPS 命令來檢查是否啟動(dòng) YARN
[圖片上傳失敗...(image-b8ee9a-1538235762717)]
當(dāng)顯示上圖時(shí),就表示 YARN 成功啟動(dòng)了
d). 向 YARN 以 jar 包的方式提交作業(yè),假設(shè) jar 包為 example.jar 格式為:
hadoop jar jar包名 應(yīng)用名 輸入路徑 輸出路徑
例如:
hadoop jar example.jar wordccount /input/hello.txt /output/helloCount.txt
參考
[1] https://blog.csdn.net/Mr_HHH/article/details/81127373
[2] http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html
[3] https://www.ibm.com/developerworks/library/bd-yarn-intro/index.html