Hadoop學(xué)習(xí)筆記(四)YARN

YARN產(chǎn)生背景

為什么會(huì)產(chǎn)生YRAN?這個(gè)與MapReduce1.x的架構(gòu)有關(guān),正是因?yàn)镸apReduce1.x存在許多的問題,才會(huì)產(chǎn)生 YARN。

MapReduce1.x的架構(gòu)如下:

MapReduce1.x的架構(gòu)

Hadoop1.x時(shí),MapReduce的架構(gòu)仍然是主從架構(gòu)。一個(gè)JobTracker帶多個(gè)TaskTracker,主節(jié)點(diǎn)為JobTracker,只有一個(gè),從節(jié)點(diǎn)為TaskTracker,可以有多個(gè),從節(jié)點(diǎn)通過向主節(jié)點(diǎn)發(fā)送心跳信息(heartbeat)來告訴它自己的運(yùn)行情況,而主節(jié)點(diǎn)則是負(fù)責(zé)管理調(diào)度的工作。

JobTracker(JT):負(fù)責(zé)資源管理和作業(yè)調(diào)度。

TaskTracker(TT):定期向JT匯報(bào)本節(jié)點(diǎn)的健康狀況、資源使用情況、作業(yè)執(zhí)行情況。接收來自JT的命令,從而啟動(dòng)任務(wù)或殺死任務(wù)。

那么這個(gè)架構(gòu)存在什么樣的問題呢?

首先是單點(diǎn)故障的問題,所有的從節(jié)點(diǎn)(TT)都是跟主節(jié)點(diǎn)(JT)直接關(guān)聯(lián)的,如果主節(jié)點(diǎn)不小心掛了,那么整個(gè)系統(tǒng)就崩潰了,就沒有辦法運(yùn)行了。

其次,JT的壓力大且不易擴(kuò)展,他要接收所有從節(jié)點(diǎn)(TT)的心跳信息(heartbeat)和客戶端的請(qǐng)求,JT承擔(dān)的職責(zé)特別多,隨著集群擴(kuò)展后,那么JT的壓力就會(huì)越來越大。

最后,最大的問題就是兼容性問題,它不兼容除了MapReduce外的其他框架,比如Spark是不能跑在這個(gè)系統(tǒng)上的。

而有了YARN之后,基于YARN之上可以運(yùn)行很多其他的計(jì)算框架,不同計(jì)算框架可以共享同一個(gè)HDFS集群上數(shù)據(jù),享受整體的資源調(diào)度。它相當(dāng)于操作系統(tǒng),起著調(diào)度管理的工作。

YARN概述

關(guān)于YARN的概述我們?cè)谥暗奈恼轮幸呀?jīng)說過了,這里就不多介紹了。

  • YARN的全稱是Yet Another Resource Negotiatord。
  • 通用的資源管理系統(tǒng),要申請(qǐng)資源統(tǒng)一經(jīng)過YARN進(jìn)行申請(qǐng)就行了。
  • 為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度。

YRAN架構(gòu)

YARN的架構(gòu)如下圖所示:

YARN的架構(gòu)

YARN的架構(gòu)由這幾個(gè)部分構(gòu)成:

  1. ResourceManager(RM):資源管理器
    • 整個(gè)集群同一時(shí)間提供服務(wù)的RM只有一個(gè),負(fù)責(zé)集群資源的統(tǒng)一管理和調(diào)度。一般來說RM只有一個(gè),多了的話不好協(xié)調(diào)容易混亂,但是如果只有一個(gè)的話,如果RM出問題了整個(gè)系統(tǒng)就崩潰了,所以生產(chǎn)中盡量會(huì)再加一個(gè)作為備用,這樣就算主RM掛了,備用的RM也可以繼續(xù)工作,但是在同一時(shí)間提供服務(wù)的只有一個(gè),要么是主RM,要么是備用RM。
    • 處理客戶端的請(qǐng)求:提交作業(yè)、殺死作業(yè)。
    • 監(jiān)控NM,一旦某個(gè)NM掛了,那么該NM上運(yùn)行的任務(wù)需要告訴AM來如何進(jìn)行處理。
  2. NodeManager(NM):節(jié)點(diǎn)管理器
    • 整個(gè)集群中有多個(gè)NM,負(fù)責(zé)自己本身節(jié)點(diǎn)資源管理使用。管理自身節(jié)點(diǎn)的資源,比如某一時(shí)刻還剩多少資源,NM是能知道的。
    • 定時(shí)向RM匯報(bào)本節(jié)點(diǎn)的資源使用情況,RM只有知道所有NM上的資源使用情況,才能合理的進(jìn)行調(diào)度。對(duì)于一個(gè)特定的作業(yè),他才知道該分配到哪個(gè)NM上去。
    • 接受并處理來自RM的各種命令,比如啟動(dòng)Container。NM既然作為主從結(jié)構(gòu)的從節(jié)點(diǎn),那么就應(yīng)該聽老大的話,老大給你分配了任務(wù),讓你去執(zhí)行你就去執(zhí)行,讓你別干了你就別干了。
    • 處理來自AM的命令,AM告訴NM需要在節(jié)點(diǎn)上啟動(dòng)多少container跑task,NM才能運(yùn)行。
    • 單個(gè)節(jié)點(diǎn)的資源管理,在跑作業(yè)的過程中,對(duì)自己節(jié)點(diǎn)上資源的使用和剩余多少資源必須要有數(shù)。
  3. ApplicationMaster(AM):應(yīng)用程序主控程序
    • 每個(gè)應(yīng)用程序?qū)?yīng)一個(gè),比如一個(gè)Spark或者一個(gè)MapReduce作業(yè)對(duì)應(yīng)一個(gè)AM。負(fù)責(zé)應(yīng)用程序的管理,為應(yīng)用程序向RM申請(qǐng)資源,比如需要多少內(nèi)存和計(jì)算量。拿到資源后再分配給內(nèi)部的task進(jìn)行處理。
    • 需要與NM進(jìn)行通信,啟動(dòng)或者停止task,task是運(yùn)行在container里面,AM也是運(yùn)行在container里面。
  4. Container:容器
    • 封裝了CPU、Memory等資源的一個(gè)容器,相當(dāng)于一個(gè)任務(wù)運(yùn)行環(huán)境的抽象。
  5. Client:客戶端
    • 提交作業(yè)、查看作業(yè)的運(yùn)行進(jìn)度、殺死作業(yè)

關(guān)于這個(gè)架構(gòu)我是這么理解的,可以將它與企業(yè)或者公司的管理進(jìn)行對(duì)比:

Client,很簡(jiǎn)單自然就是跟公司合作的客戶。提交一個(gè)作業(yè)就相當(dāng)于客戶跟公司一筆生意談成了,客戶提要求,公司負(fù)責(zé)幫客戶去完成項(xiàng)目,只是這里沒有金錢交易而已。

RM,相當(dāng)于公司的管事的boss,權(quán)力很大,所有公司的事都要聽他的。我們對(duì)照則RM的作用一條一條來理解,首先,一個(gè)公司同一時(shí)間只能有一個(gè)拍板的,不能你說你的他說他的,最后整個(gè)公司也不知道聽誰的,那就徹底亂套了。如果某天老板生病了,那就只能委托一個(gè)代理暫時(shí)幫他行使管理的責(zé)任,這個(gè)代理就是備用的RM。其次,老板可以決定項(xiàng)目何時(shí)終止,何時(shí)開始,這個(gè)很好理解。NM相當(dāng)于公司下面分設(shè)的許多部門,AM相當(dāng)于某個(gè)具體項(xiàng)目的負(fù)責(zé)人,具體的我們待會(huì)再說,暫時(shí)先這么理解。最后,老板可以隨時(shí)知道部門的情況,如果某個(gè)部門集體度假了,或者出了什么重大事故,那么自然這個(gè)部門所牽涉的項(xiàng)目就要被擱置,這時(shí)候?qū)τ谶@個(gè)項(xiàng)目該怎么處理,是等他們回來再繼續(xù),還是直接把項(xiàng)目給其他的部門,這就要問這個(gè)項(xiàng)目的負(fù)責(zé)人了,怎么決斷就要聽他的意見,畢竟這個(gè)項(xiàng)目是他負(fù)責(zé)的。

NM所在的整個(gè)節(jié)點(diǎn),相當(dāng)于公司的各個(gè)部門,唯一的區(qū)別就是,在公司中,往往不會(huì)設(shè)立兩個(gè)財(cái)務(wù)部門或三個(gè)人力部門,公司的部門往往是唯一的。而YARN 的結(jié)構(gòu)中,每個(gè)節(jié)點(diǎn)并不具有唯一性,所以我們?yōu)榱祟惐确奖悖梢约僭O(shè)這個(gè)公司有3個(gè)開發(fā)部門,4個(gè)測(cè)試部門這樣。這樣RM就可以理解成這個(gè)部門的負(fù)責(zé)人,顯然RM對(duì)于本部門的情況是十分了解的,包括哪個(gè)人今天有沒有來上班,部門現(xiàn)在的工作能力如何,是不是有人還處于空閑沒事做的狀態(tài)等等。負(fù)責(zé)人需要定期向老板遞交工作記錄(心跳信息)從而讓老板知道這個(gè)部門的工作能力如何啊等等這些信息,這樣下次有新任務(wù)的時(shí)候,老板就知道能不能分配給這個(gè)部門。作為部門負(fù)責(zé)人,自然得聽老板的話,老板給你個(gè)任務(wù),讓你立馬在部門中給我組個(gè)小組(container)完成,你就要執(zhí)行老板的命令。同時(shí)對(duì)于項(xiàng)目負(fù)責(zé)人的要求,他也要盡量可能滿足,比如項(xiàng)目負(fù)責(zé)人說我這個(gè)項(xiàng)目需要你們部門哪些哪些人幫我去做,那部門負(fù)責(zé)人就按照他的要求把那些人組成一個(gè)小組去執(zhí)行任務(wù)。

AM,項(xiàng)目負(fù)責(zé)人或團(tuán)隊(duì),一個(gè)公司可能有多個(gè)項(xiàng)目,自然每個(gè)項(xiàng)目需要有一個(gè)項(xiàng)目負(fù)責(zé)人。項(xiàng)目負(fù)責(zé)人在做項(xiàng)目的時(shí)候必定會(huì)用到公司中的資源,比如開會(huì)需要會(huì)議室、打印機(jī)啊,那自然得跟老板去申請(qǐng)說,我這個(gè)項(xiàng)目需要利用公司的會(huì)議室、打印機(jī)等等,老板說可以啊沒問題,那么他拿到這些資源后就會(huì)給每個(gè)小組說,我已經(jīng)幫你們申請(qǐng)到這些東西了,以后你們要用的話就直接可以用了。最后,他可以跟某個(gè)部門的負(fù)責(zé)人說,我需要你們部門的幾個(gè)人組成一個(gè)小組(container)來幫我做這個(gè)項(xiàng)目,或者你們部門的這個(gè)小組做的不行,我不要他們了。

container就是一個(gè)小組,小組內(nèi)有大家可以共用的一些資源,每個(gè)項(xiàng)目分成一個(gè)個(gè)小的任務(wù)也是在各個(gè)小組中完成的,每個(gè)小組都屬于某個(gè)部門,一個(gè)部門可以有若干個(gè)小組。

不知道這樣說會(huì)不會(huì)對(duì)理解YARN的架構(gòu)有所幫助,這只是我在看到這個(gè)架構(gòu)時(shí)的一些理解。

YRAN執(zhí)行流程

YARN的執(zhí)行流程
  1. 客戶端提交一個(gè)作業(yè)請(qǐng)求給RM,可以是MapReduce作業(yè),也可以Spark作業(yè)。
  2. RM會(huì)為作業(yè)分配第一個(gè)container,假設(shè)這個(gè)container運(yùn)行在第二個(gè)節(jié)點(diǎn)上,這樣RM就會(huì)與對(duì)應(yīng)的NM進(jìn)行通信,也就是跟第二個(gè)節(jié)點(diǎn)的NM說,我要在你上面啟動(dòng)一個(gè)container。
  3. NM在接到了RM的指令后,在NM上啟動(dòng)了一個(gè)container,而application master就運(yùn)行在這個(gè)container之中。
  4. AM啟動(dòng)完了之后,會(huì)在RM中進(jìn)行注冊(cè),注冊(cè)了用戶就可以通過RM看到作業(yè)執(zhí)行的進(jìn)度了。并且AM會(huì)將需要使用的資源,比如需要多少memory,向RM進(jìn)行申請(qǐng),如果申請(qǐng)到資源就美滋滋,接著進(jìn)行下面的步驟。
  5. 申請(qǐng)到資源后,AM就在對(duì)應(yīng)的NM上開始啟動(dòng)任務(wù)。假設(shè)需要在第一個(gè)NM啟動(dòng)2個(gè)task,在第三個(gè)NM上啟動(dòng)1個(gè)task,那么把這些通知發(fā)送給對(duì)應(yīng)的NM。
  6. NM在接受到這些通知后,就知道自己需要?jiǎng)?chuàng)建幾個(gè)task,于是在NM上啟動(dòng)相應(yīng)的container,并把task放到container中去運(yùn)行。

其實(shí)這個(gè)流程并不是很復(fù)雜,可以對(duì)照著之前舉的公司的例子,把相應(yīng)的角色帶入進(jìn)去理解一下流程。

我們?cè)賮硭伎家粋€(gè)問題,為什么說在1.x版本不能支持其他計(jì)算框架的運(yùn)行,而使用了YARN后就可以了呢?關(guān)鍵在于這個(gè)流程是個(gè)通用的流程,AM作為應(yīng)用程序的主控程序,如果我們對(duì)于相應(yīng)的框架都做出對(duì)應(yīng)的AM的實(shí)現(xiàn),也就是說,如果是MapReduce,那么這里的AM就是MapReduce對(duì)應(yīng)的AM,對(duì)于spark也是同樣的道理。那么在YARN之上就可以運(yùn)行很多計(jì)算框架了。其實(shí)可以把YARN的作用理解成可以跑各種計(jì)算框架的操作系統(tǒng),就跟使用Windows操作系統(tǒng),你就可以在這個(gè)操作系統(tǒng)上運(yùn)行各種軟件一樣。

更多的信息可以參見hadoop官網(wǎng)上關(guān)于YARN架構(gòu)的文檔描述(http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容