參考博客(理解Hadoop YARN架構(gòu) - CSDN博客)
1、YARN介紹
??????? YARN(Yet Another Resource Negotiator)是一個通用的資源管理平臺,可為各類計算框架提供資源的管理和調(diào)度。其核心出發(fā)點是為了分離資源管理與作業(yè)調(diào)度/監(jiān)控,實現(xiàn)分離的做法是擁有一個全局的資源管理器(ResourceManager,RM),以及每個應(yīng)用程序?qū)?yīng)一個的應(yīng)用管理器(ApplicationMaster,AM),應(yīng)用程序由一個作業(yè)(Job)或者Job的有向無環(huán)圖(DAG)組成。
??????? YARN可以將多種計算框架(如離線處理MapReduce、在線處理的Storm、迭代式計算框架Spark、流式處理框架S4等) 部署到一個公共集群中,共享集群的資源。并提供如下功能:
資源的統(tǒng)一管理和調(diào)度:
?????? 集群中所有節(jié)點的資源(內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等)抽象為Container,根據(jù)每個節(jié)點的配置不同,所能抽象出來的Container的數(shù)量也是不一樣的(Container配置參考:YARN的Memory和CPU調(diào)優(yōu)配置詳解-hackeruncle-ITPUB博客)。計算框架需要資源進行運算任務(wù)時需要向YARN申請Container, YARN按照特定的策略對資源進行調(diào)度進行Container的分配。
資源隔離:
?????? YARN使用了輕量級資源隔離機制Cgroups進行資源隔離以避免相互干擾,一旦Container使用的資源量超過事先定義的上限值,就將其殺死。YARN是對Mapreduce V1重構(gòu)得到的,有時候也成為MapReduce V2。
?????? YARN可以看成一個云操作系統(tǒng),由一個ResourceManager和多個NodeManager組成, 它負(fù)責(zé)管理所有NodeManger上多維度資源, 并以Container(啟動一個Container相當(dāng)于啟動一個進程)方式分配給應(yīng)用程序啟動ApplicationMaster(相當(dāng)于主進程中運行邏輯) 或運行ApplicationMaster切分的各Task(相當(dāng)于子進程中運行邏輯)。
2、YARN框架

YARN總體上是Master/Slave結(jié)構(gòu),主要由ResourceManager、NodeManager、 ApplicationMaster和Container等幾個組件構(gòu)成。
ResourceManager(RM)
負(fù)責(zé)對各NM上的資源進行統(tǒng)一管理和調(diào)度。將AM分配空閑的Container運行并監(jiān)控其運行狀態(tài)。對AM申請的資源請求分配相應(yīng)的空閑Container。主要由兩個組件構(gòu)成:調(diào)度器和應(yīng)用程序管理器:
調(diào)度器(Scheduler)
調(diào)度器根據(jù)容量、隊列等限制條件(如每個隊列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個正在運行的應(yīng)用程序。調(diào)度器僅根據(jù)各個應(yīng)用程序的資源需求進行資源分配,而資源分配單位是Container,從而限定每個任務(wù)使用的資源量。Shceduler不負(fù)責(zé)監(jiān)控或者跟蹤應(yīng)用程序的狀態(tài),也不負(fù)責(zé)任務(wù)因為各種原因而需要的重啟(由ApplicationMaster負(fù)責(zé))??傊?,調(diào)度器根據(jù)應(yīng)用程序的資源要求,以及集群機器的資源情況,為應(yīng)用程序分配封裝在Container中的資源。
應(yīng)用程序管理器(Applications Manager)
應(yīng)用程序管理器負(fù)責(zé)管理整個系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動AM、監(jiān)控AM運行狀態(tài)并在失敗時重新啟動等,跟蹤分給的Container的進度、狀態(tài)也是其職責(zé)。
NodeManager (NM)
NM是每個節(jié)點上的資源和任務(wù)管理器。它會定時地向RM匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài);同時會接收并處理來自AM的Container 啟動/停止等請求。
ApplicationMaster (AM):
用戶提交的應(yīng)用程序均包含一個AM,負(fù)責(zé)應(yīng)用的監(jiān)控,跟蹤應(yīng)用執(zhí)行狀態(tài),重啟失敗任務(wù)等。ApplicationMaster是應(yīng)用框架,它負(fù)責(zé)向ResourceManager協(xié)調(diào)資源,并且與NodeManager協(xié)同工作完成Task的執(zhí)行和監(jiān)控。MapReduce就是原生支持的一種框架,可以在YARN上運行Mapreduce作業(yè)。有很多分布式應(yīng)用都開發(fā)了對應(yīng)的應(yīng)用程序框架,用于在YARN上運行任務(wù),例如Spark,Storm等。如果需要,我們也可以自己寫一個符合規(guī)范的YARN application。
注意:每個應(yīng)用程序只有一個AM,而且是獨立的,隨著該程序申請而開啟,隨著該程序的完成而結(jié)束。
Container:
Container是YARN中的資源抽象,它封裝了某個節(jié)點上的多維度資源,如內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等,當(dāng)AM向RM申請資源時,RM為AM返回的資源便是用Container 表示的。 YARN會為每個任務(wù)分配一個Container且該任務(wù)只能使用該Container中描述的資源。
3、YARN工作流程

1、client向YARN中提交應(yīng)用程序,其中包括AM程序、啟動AM的命令、命令參數(shù)、用戶程序等;事實上,需要準(zhǔn)確描述運行ApplicationMaster的unix進程的所有信息。提交工作通常由YarnClient來完成。
2、RM為該應(yīng)用程序?qū)ふ襈M并分配第一個Container,并與對應(yīng)的NM通信,要求它在這個Container中啟動AM(注意:AM對)。
3、AM首先向RM注冊,這樣用戶可以直接通過RM査看應(yīng)用程序的運行狀態(tài),運行狀態(tài)通過
AMRMClientAsync.CallbackHandler的getProgress() 方法來傳遞給RM。
然后它將為各個任務(wù)申請資源,并監(jiān)控它的運行狀態(tài),直到運行結(jié)束,即重復(fù)步驟4?7;
4、AM采用輪詢的方式通過RPC協(xié)議向RM申請和領(lǐng)取資源;資源的協(xié)調(diào)通過 AMRMClientAsync異步完成,相應(yīng)的處理方法封裝在AMRMClientAsync.CallbackHandler中。
5、—旦AM申請到資源后,便與對應(yīng)的NM通信,要求它啟動任務(wù);通常需要指定一個ContainerLaunchContext,提供Container啟動時需要的信息。
6、NM為任務(wù)設(shè)置好運行環(huán)境(包括環(huán)境變量、JAR包、二進制程序等)后,將任務(wù)啟動命令寫到一個腳本中,并通過運行該腳本啟動任務(wù);
7、各個任務(wù)通過某個RPC協(xié)議向AM匯報自己的狀態(tài)和進度,以讓AM隨時掌握各個任務(wù)的運行狀態(tài),從而可以在任務(wù)失敗時重新啟動任務(wù);ApplicationMaster與NM的通信通過NMClientAsync
object來完成,容器的所有事件通過NMClientAsync.CallbackHandler來處理。例如啟動、狀態(tài)更新、停止等。
8、應(yīng)用程序運行完成后,AM向RM注銷并關(guān)閉自己。