一球订、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è)框架特定的庫(kù),其任務(wù)是協(xié)調(diào)來(lái)自 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 簡(jiǎn)單地降級(jí)為分布式應(yīng)用程序的角色(但仍然是非常流行且有用的)哥遮,現(xiàn)在稱為MRv2岂丘。
此外,YARN 通過 ReservationSystem 支持資源預(yù)留的概念眠饮,ReservationSystem 允許用戶通過配置文件來(lái)指定資源的時(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搞莺,簡(jiǎn)稱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 來(lái)運(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)來(lái)自ResourceManager的資源坤学,并通過NodeManager監(jiān)視容易的執(zhí)行和資源使用情況。
可以說(shuō)报慕,ApplicationMaster 與 ResourceManager 之間的通信是整個(gè) Yarn 應(yīng)用從提交到運(yùn)行的最核心部分深浮,是 Yarn 對(duì)整個(gè)集群進(jìn)行動(dòng)態(tài)資源管理的根本步驟,Yarn 的動(dòng)態(tài)性眠冈,就是來(lá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)存等資源)
- 接收及處理來(lái)自 ResourceManager 的命令請(qǐng)求,分配 Container 給應(yīng)用的某個(gè)任務(wù)脓鹃;
- 定時(shí)地向RM匯報(bào)以確保整個(gè)集群平穩(wěn)運(yùn)行逸尖,RM 通過收集每個(gè) NodeManager 的報(bào)告信息來(lái)追蹤整個(gè)集群健康狀態(tài)的,而 NodeManager 負(fù)責(zé)監(jiān)控自身的健康狀態(tài)将谊;
- 處理來(lá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信息
來(lái)啟動(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)隘竭。
精簡(jiǎn)版的:
- 步驟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交互來(lái)啟動(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
命令來(lái)檢查是否啟動(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