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收到提交請求后,先向資源調(diào)度器申請用以啟動(dòng)ApplicationMaster的資源,待申請到資源后,再由ApplicationMasterLauncher與對應(yīng)的NodeManager通信,從而啟動(dòng)應(yīng)用程序的ApplicationMaster
- ApplicationMaster啟動(dòng)完成后,ApplicationMasterLauncher會(huì)通過事件的形式,將剛剛啟動(dòng)的ApplicationMaster注冊到AMLivelinessMonitor,以啟動(dòng)心跳監(jiān)控
- ApplicationMaster啟動(dòng)后,先向ApplicationMasterService注冊,并將自己所在host、端口號等信息匯報(bào)給它
- ApplicationMaster運(yùn)行過程中,周期性地向ApplicationMasterService匯報(bào)心跳信息
- ApplicationMasterService每次收到ApplicationMaster的心跳信息后,將通知AMLivelinessMonitor更新該應(yīng)用程序的最近匯報(bào)心跳的時(shí)間
- 當(dāng)應(yīng)用程序運(yùn)行完成后,ApplicationMaster向ApplicationMasterService發(fā)送請求,注銷自己
- ApplicationMasterService收到注銷請求后,標(biāo)注應(yīng)用程序運(yùn)行狀態(tài)為完成,同時(shí)通知AMLivelinessMonitor移除對它的心跳監(jiān)控
介紹三個(gè)服務(wù)
(1) ApplicationMasterLauncher
ApplicationMasterLauncher即是一個(gè)服務(wù),也是一個(gè)事件處理器,它處理AMLauncherEvent類型的事件,該類型事件有兩種,分別是請求啟動(dòng)一個(gè)ApplicationMaster的"LAUNCH"事件和請求清理一個(gè)ApplicationMaster的"CLEANUP"事件。ApplicationMasterLauncher維護(hù)了一個(gè)線程池,從而能夠盡快地處理這兩種事件
- 如果ApplicationMasterLauncher收到了"LAUNCH"類型的事件,它會(huì)與對應(yīng)的NodeManager通信,要求它啟動(dòng)ApplicationMaster。整個(gè)過程比較簡單,首先創(chuàng)建一個(gè)ContainerManagementProtocol協(xié)議的客戶端,然后向?qū)?yīng)的NodeManager發(fā)起連接請求,接著將啟動(dòng)AM所需的各種信息,包括啟動(dòng)命令、JAR包、環(huán)境變量等信息,封裝成一個(gè)StartContainerRequest對象,然后通過RPC函數(shù)ContainerManagementProtocol#startContainer發(fā)送給對應(yīng)的NM
- 如果ApplicationMasterLauncher收到了"CLEANUP"類型的事件,它與對應(yīng)的NodeManager通信,要求它殺死ApplicationMaster。整個(gè)過程與啟動(dòng)AM的過程類似
(2) AMLivelinessMonitor
該服務(wù)周期性遍歷所有應(yīng)用程序的ApplicationMaster,如果一個(gè)ApplicationMaster在一定時(shí)間內(nèi)未匯報(bào)心跳信息,則認(rèn)為它死掉了,它上面所有正在運(yùn)行的Container將被置為運(yùn)行失??;如果AM運(yùn)行失敗,則由RM重新為它申請資源,以便能夠重新分配到另外一個(gè)節(jié)點(diǎn)上執(zhí)行
(3) ApplicationMasterService
ApplicationMasterService實(shí)現(xiàn)了RPC協(xié)議ApplicationMasterProtocol,負(fù)責(zé)處理來自ApplicationMaster的請求,請求主要包括注冊、心跳和清理三種,其中,注冊是ApplicationMaster啟動(dòng)時(shí)發(fā)生的行為,請求包中包含AM所在節(jié)點(diǎn)、RPC端口號和tracking URL等信息;心跳是周期性行為,包含請求資源的類型描述、待釋放的Container列表等,而AMS為之返回新分配的Container、失敗的Container等信息;清理是應(yīng)用程序運(yùn)行結(jié)束時(shí)發(fā)生的行為,ApplicationMaster向RM發(fā)送清理應(yīng)用程序的請求,以回收資源和清理各種內(nèi)存空間
ApplicationMasterLauncher啟動(dòng)AM后,AM做的第一件事是向RM注冊,這是通過RPC函數(shù)ApplicationMasterProtocol#registerApplicationMaster實(shí)現(xiàn)的
AM運(yùn)行過程中,需要周期性地通過RPC函數(shù)ApplicationMasterProtocol#allocate與RM通信,這主要有以下三個(gè)作用 :
- 請求資源
- 獲取新分配的資源
- 形成周期性心跳,告訴RM自己還活著
AM運(yùn)行結(jié)束后,需要通過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ì)通過心跳機(jī)制告訴對應(yīng)的AM,由AM決定是否重新執(zhí)行。如果需要,則AM重新向RM申請資源,然后由AM與對應(yīng)的NodeManager通信以重新運(yùn)行失敗的Container
(2) NodesListManager
NodesListManager管理exlude(類似于黑名單)和inlude(類似于白名單)節(jié)點(diǎn)列表,這兩個(gè)列表所在的文件分別可通過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。需要注意的是,管理員可通過命令"bin/yarn rmadmin -refreshNodes"動(dòng)態(tài)加載這兩個(gè)文件
(3) ResourceTrackerService
ResourceTrackerService實(shí)現(xiàn)了RPC協(xié)議ResourceTracker,負(fù)責(zé)處理來自各個(gè)NodeManager的請求,請求主要包括注冊和心跳兩種,其中,注冊是NodeManager啟動(dòng)時(shí)發(fā)生的行為,請求包中包含節(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注冊,這是通過RPC函數(shù)ResourceTracker#registerNodeManager實(shí)現(xiàn)的,注冊信息包括節(jié)點(diǎn)可用資源總量,對外開放的HTTP端口號等
NM啟動(dòng)后,他會(huì)周期性地通過RPC函數(shù)ResourceTracker#nodeHeartbeat匯報(bào)心跳,心跳信息包含各個(gè)Container運(yùn)行狀態(tài),運(yùn)行的Application列表,節(jié)點(diǎn)健康狀況等信息,而RM則為之返回需要釋放的Container列表,Application列表等