NodeManager的一個(gè)最重要的功能是根據(jù)ApplicationMaster的要求啟動(dòng)container,由于各個(gè)節(jié)點(diǎn)上的container由ResourceManager進(jìn)行統(tǒng)一管理和分配的,通常,ResourceManager將Container分配給ApplicationMaster,ApplicationMaster再進(jìn)一步要求對(duì)應(yīng)的NodeManager啟動(dòng)container。為防止ApplicationMaster未經(jīng)授權(quán)隨意要求NodeManager啟動(dòng)container,ResourceManager一般會(huì)為每個(gè)container分配一個(gè)令牌(ApplicationMaster無法偽造),而NodeManager啟動(dòng)任何container之前均會(huì)對(duì)令牌的合法性進(jìn)行驗(yàn)證,一旦通過驗(yàn)證后,NodeManager才會(huì)按照一定的流程啟動(dòng)該container。本章將介紹NodeManager啟動(dòng)container的詳細(xì)流程。
正式介紹container啟動(dòng)流程之前,先介紹幾個(gè)術(shù)語:
(1)Application 用戶提交的任何一個(gè)應(yīng)用程序,在YARN中被稱為Application。
(2)Container 一個(gè)Application通常會(huì)被分解成多個(gè)任務(wù)并行執(zhí)行,其中,每個(gè)任務(wù)要使用一定量的資源,這些資源被封裝成container。詳細(xì)說來,container不僅包含一個(gè)任務(wù)的資源說明,還包含很多其他信息,比如Container對(duì)應(yīng)的節(jié)點(diǎn)、啟動(dòng)container所需的文件資源、環(huán)境變量和命令等信息。
(3)資源本地化 在container中啟動(dòng)任務(wù)之前,先要為任務(wù)準(zhǔn)備好各種文件資源,這些文件資源通常在用戶提交應(yīng)用程序時(shí)已上傳到HDFS上,而container啟動(dòng)之前,需要下載到本地工作錄下,該過程稱為資源本地化。
YARN中采用了事件驅(qū)動(dòng)模型,YARN按照事件將各個(gè)對(duì)象組織起來,如果一個(gè)對(duì)象存在多種狀態(tài),則用一個(gè)狀態(tài)機(jī)描述它的生命周期,其中,狀態(tài)機(jī)的狀態(tài)變化是由事件驅(qū)動(dòng)的,一個(gè)事件可以使對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài),同時(shí)觸發(fā)一個(gè)行為,而該行為可能在此發(fā)出一個(gè)事件,使得另外一些對(duì)象發(fā)生狀態(tài)轉(zhuǎn)移。
如下如所示,一個(gè)時(shí)間可以使對(duì)象的一個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài),也可以轉(zhuǎn)移到多個(gè)可能的狀態(tài)中的一個(gè),這種情況下,具體轉(zhuǎn)移到哪個(gè)狀態(tài),由行為函數(shù)的返回值決定。
NodeManager中包含三個(gè)狀態(tài)機(jī),分別為對(duì)象LocalizedResources、Application(由ApplicationImpl實(shí)現(xiàn))和Container(由ContainerImpl實(shí)現(xiàn)),具體如下(其中action未畫出,這三個(gè)圖來源為:MAPREDUCE-279):
本節(jié)從源代碼級(jí)別分析container啟動(dòng)過程,具體如下圖所示,讀者可對(duì)照代碼閱讀以下流程圖。
Container的啟動(dòng)開始于ApplicationMaster調(diào)用ContainerManager::startContainer(),而NodeManager中的ContainerManagerImpl收到該RPC請(qǐng)求后,經(jīng)歷的整個(gè)過程如下所示:
聯(lián)系客服