ApplicationMaster管理部分主要由三個(gè)服務(wù)構(gòu)成枷莉,分別是ApplicationMasterLauncher举瑰、AMLivelinessMonitor和ApplicationMasterService榨崩,它們共同管理應(yīng)用程序的ApplicationMaster的生命周期
ApplicationMasterLauncher削解、AMLivelinessMonitor和ApplicationMasterService這三個(gè)組件是如何協(xié)同管理ApplicationMaster生命周期把夸,介紹從ResourceManager獲得資源啟動(dòng)ApplicationMaster :
- 用戶向YARN ResourceManager提交應(yīng)用程序旁舰,ResourceManager收到提交請(qǐng)求后锋华,先向資源調(diào)度器申請(qǐng)用以啟動(dòng)ApplicationMaster的資源,待申請(qǐng)到資源后箭窜,再由ApplicationMasterLauncher與對(duì)應(yīng)的NodeManager通信毯焕,從而啟動(dòng)應(yīng)用程序的ApplicationMaster
- ApplicationMaster啟動(dòng)完成后,ApplicationMasterLauncher會(huì)通過(guò)事件的形式磺樱,將剛剛啟動(dòng)的ApplicationMaster注冊(cè)到AMLivelinessMonitor纳猫,以啟動(dòng)心跳監(jiān)控
- ApplicationMaster啟動(dòng)后,先向ApplicationMasterService注冊(cè)竹捉,并將自己所在host芜辕、端口號(hào)等信息匯報(bào)給它
- ApplicationMaster運(yùn)行過(guò)程中,周期性地向ApplicationMasterService匯報(bào)心跳信息
- ApplicationMasterService每次收到ApplicationMaster的心跳信息后块差,將通知AMLivelinessMonitor更新該應(yīng)用程序的最近匯報(bào)心跳的時(shí)間
- 當(dāng)應(yīng)用程序運(yùn)行完成后侵续,ApplicationMaster向ApplicationMasterService發(fā)送請(qǐng)求,注銷自己
- ApplicationMasterService收到注銷請(qǐng)求后憾儒,標(biāo)注應(yīng)用程序運(yùn)行狀態(tài)為完成询兴,同時(shí)通知AMLivelinessMonitor移除對(duì)它的心跳監(jiān)控
介紹三個(gè)服務(wù)
(1) ApplicationMasterLauncher
ApplicationMasterLauncher即是一個(gè)服務(wù),也是一個(gè)事件處理器起趾,它處理AMLauncherEvent類型的事件诗舰,該類型事件有兩種,分別是請(qǐng)求啟動(dòng)一個(gè)ApplicationMaster的"LAUNCH"事件和請(qǐng)求清理一個(gè)ApplicationMaster的"CLEANUP"事件训裆。ApplicationMasterLauncher維護(hù)了一個(gè)線程池眶根,從而能夠盡快地處理這兩種事件
- 如果ApplicationMasterLauncher收到了"LAUNCH"類型的事件,它會(huì)與對(duì)應(yīng)的NodeManager通信边琉,要求它啟動(dòng)ApplicationMaster属百。整個(gè)過(guò)程比較簡(jiǎn)單,首先創(chuàng)建一個(gè)ContainerManagementProtocol協(xié)議的客戶端变姨,然后向?qū)?yīng)的NodeManager發(fā)起連接請(qǐng)求族扰,接著將啟動(dòng)AM所需的各種信息,包括啟動(dòng)命令、JAR包渔呵、環(huán)境變量等信息怒竿,封裝成一個(gè)StartContainerRequest對(duì)象,然后通過(guò)RPC函數(shù)ContainerManagementProtocol#startContainer發(fā)送給對(duì)應(yīng)的NM
- 如果ApplicationMasterLauncher收到了"CLEANUP"類型的事件扩氢,它與對(duì)應(yīng)的NodeManager通信耕驰,要求它殺死ApplicationMaster。整個(gè)過(guò)程與啟動(dòng)AM的過(guò)程類似
(2) AMLivelinessMonitor
該服務(wù)周期性遍歷所有應(yīng)用程序的ApplicationMaster录豺,如果一個(gè)ApplicationMaster在一定時(shí)間內(nèi)未匯報(bào)心跳信息朦肘,則認(rèn)為它死掉了,它上面所有正在運(yùn)行的Container將被置為運(yùn)行失斔ⅰ媒抠;如果AM運(yùn)行失敗,則由RM重新為它申請(qǐng)資源兢哭,以便能夠重新分配到另外一個(gè)節(jié)點(diǎn)上執(zhí)行
(3) ApplicationMasterService
ApplicationMasterService實(shí)現(xiàn)了RPC協(xié)議ApplicationMasterProtocol领舰,負(fù)責(zé)處理來(lái)自ApplicationMaster的請(qǐng)求夫嗓,請(qǐng)求主要包括注冊(cè)迟螺、心跳和清理三種,其中舍咖,注冊(cè)是ApplicationMaster啟動(dòng)時(shí)發(fā)生的行為矩父,請(qǐng)求包中包含AM所在節(jié)點(diǎn)、RPC端口號(hào)和tracking URL等信息排霉;心跳是周期性行為窍株,包含請(qǐng)求資源的類型描述、待釋放的Container列表等攻柠,而AMS為之返回新分配的Container球订、失敗的Container等信息;清理是應(yīng)用程序運(yùn)行結(jié)束時(shí)發(fā)生的行為瑰钮,ApplicationMaster向RM發(fā)送清理應(yīng)用程序的請(qǐng)求冒滩,以回收資源和清理各種內(nèi)存空間
ApplicationMasterLauncher啟動(dòng)AM后,AM做的第一件事是向RM注冊(cè)浪谴,這是通過(guò)RPC函數(shù)ApplicationMasterProtocol#registerApplicationMaster實(shí)現(xiàn)的
AM運(yùn)行過(guò)程中开睡,需要周期性地通過(guò)RPC函數(shù)ApplicationMasterProtocol#allocate與RM通信,這主要有以下三個(gè)作用 :
- 請(qǐng)求資源
- 獲取新分配的資源
- 形成周期性心跳苟耻,告訴RM自己還活著
AM運(yùn)行結(jié)束后篇恒,需要通過(guò)RPC函數(shù)ApplicationMasterProtocol#finishApplicationMaster告訴RM自己運(yùn)行結(jié)束,可以回收資源和清理各種數(shù)據(jù)結(jié)果了
NodeManager管理部分主要由三個(gè)服務(wù)構(gòu)成凶杖,分別是NMLivelinessMonitor胁艰,NodesListManager和ResourceTrackerService,它們共同管理NodeManager的生命周期
介紹三個(gè)服務(wù)
(1) NMLivelinessMonitor
該服務(wù)周期性的遍歷集群中所有NodeManager,如果一個(gè)NodeManager在一定時(shí)間內(nèi)未匯報(bào)心跳信息腾么,則認(rèn)為它死掉了醋虏,它上面所有正在運(yùn)行的Container將被置為運(yùn)行失敗。需要注意的是哮翘,RM不會(huì)重新執(zhí)行這些Container颈嚼,它只會(huì)通過(guò)心跳機(jī)制告訴對(duì)應(yīng)的AM,由AM決定是否重新執(zhí)行饭寺。如果需要阻课,則AM重新向RM申請(qǐng)資源,然后由AM與對(duì)應(yīng)的NodeManager通信以重新運(yùn)行失敗的Container
(2) NodesListManager
NodesListManager管理exlude(類似于黑名單)和inlude(類似于白名單)節(jié)點(diǎn)列表艰匙,這兩個(gè)列表所在的文件分別可通過(guò)yarn.resourcemanager.nodes.include-path和yarn.resourcemanager.nodes.exclude-path配置限煞,其中,exlude節(jié)點(diǎn)列表可認(rèn)為是黑名單员凝,它們不允許直接與RM通信署驻,而inlude節(jié)點(diǎn)列表可認(rèn)為是白名單。默認(rèn)情況下健霹,這兩個(gè)列表均為空旺上,表示任何節(jié)點(diǎn)均被允許接入RM。需要注意的是糖埋,管理員可通過(guò)命令"bin/yarn rmadmin -refreshNodes"動(dòng)態(tài)加載這兩個(gè)文件
(3) ResourceTrackerService
ResourceTrackerService實(shí)現(xiàn)了RPC協(xié)議ResourceTracker宣吱,負(fù)責(zé)處理來(lái)自各個(gè)NodeManager的請(qǐng)求,請(qǐng)求主要包括注冊(cè)和心跳兩種瞳别,其中征候,注冊(cè)是NodeManager啟動(dòng)時(shí)發(fā)生的行為,請(qǐng)求包中包含節(jié)點(diǎn)ID祟敛,可用的資源上限等信息疤坝;而心跳時(shí)周期性行為,包含各個(gè)Container運(yùn)行狀態(tài)馆铁,運(yùn)行的Application列表跑揉,節(jié)點(diǎn)健康狀況,而ResourceTrackerService則為NM返回待釋放的Container列表叼架、Application列表等
NM啟動(dòng)時(shí)畔裕,它所作的第一件事是向RM注冊(cè),這是通過(guò)RPC函數(shù)ResourceTracker#registerNodeManager實(shí)現(xiàn)的乖订,注冊(cè)信息包括節(jié)點(diǎn)可用資源總量扮饶,對(duì)外開(kāi)放的HTTP端口號(hào)等
NM啟動(dòng)后,他會(huì)周期性地通過(guò)RPC函數(shù)ResourceTracker#nodeHeartbeat匯報(bào)心跳乍构,心跳信息包含各個(gè)Container運(yùn)行狀態(tài)甜无,運(yùn)行的Application列表扛点,節(jié)點(diǎn)健康狀況等信息,而RM則為之返回需要釋放的Container列表岂丘,Application列表等