CompositeService 多個service封裝,service定義了狀態機狀態改變的合法狀況。node
重要的方法是(子類須要實現的):serviceStart,serviceInit,serviceStop
裏面的服務有:
Dispatcher,ClientRMService,ApplicationMasterService,AplicationMasterLauncher,AdminService,ContainerAllocationExpire,NMLivenessMonitor,NodeListManager
Context每一個服務對應有context。
子類定義serviceInit,ServiceStart,ServiceStop
繼承的init,start,stop直接調用。
AbstractLivelinessMonitor父類,定義了monitor的一些基本操做。
這些服務的特色都是圍繞dispatcher。
RMDispatcher有個register方法進行註冊,將相應的Event以及對應的handler進行註冊。
不出所料,裏面不少服務都有queue,大多數都是異步完成。
Token之類的沒有使用,暫時不用考慮。
Event Type Handler
RMAppEvent RMAppEventType ApplicationEventDispatcher
RMStateStoreAppEvent 同上,是子類
RMAppAttemptEvent RMAppAttemptEventType ApplicationAttemptEventDispatcher
SchdulerEventType SchedulerEventDispatcher
RMNodeStatusEvent
狀態機
StateMachineFactory<OPERAND, STATE extends Enum<STATE>, EVENTTYPE extends Enum<EVENTTYPE>, EVENT>
經過狀態機把全部的狀態轉變都創建好後,在狀態改變後自動執行。
一、Dispatcher裏面有個queue,將全部的請求。
每一個註冊到Dispatcher的類最後都可以得到一個dispatcher的handler,用於將Event傳入到Dispatcher的queue中,有可能有一個,也可能有多個handler,根據註冊狀況。
Dispatcher內部有個線程用於將queue中得Event根據註冊的handler,dispatch到不一樣的類去處理。有些是同步有些是異步。
二、ResourceScheduler
三、ClientRMService
(1)實現的是ApllicationClientProtocol,完成的是client向Server(ResourceManager)的信息傳輸。
client submit一個job之後,提交到ClientRMService中,首先將該job,向RMAppManager submit這個job。
通過token,ACL驗證。
而後交給Dispatcher進行處理,Event是RMAppEvent,Type的enum是RMAppEventType。
這個時候返回給Client端。
(2)生成一個RMApp類,表明一個application。向Dispatcher發送一個請求
RMAppEvent(applicationId, isRecovered ? RMAppEventType.RECOVER:
app
RMAppEventType.
START
));
這裏面的EventType爲RMAppEventType.START。RMAppEvent對應的Handler爲ApplicationEventDispatcher。
RMStateStore指的是是否存儲狀態。
在RMAppImpl中,狀態轉變經過EventType肯定。
(3)隨後進入RMStateStore中,生成一個ApplicationState狀態,內部處理,內部進行handle,儲存相應的state信息,若是不是能夠recovery的話就是隻打log。
隨後出發RMAppEvent type的event,該Event的type是RMAppEventType.APP_SAVED
(4)隨後代碼流程從新進入RMAppImpl中,根據type,狀態機流轉到從State NEW_SAVING到SUBMITTED,執行StartAPpAttemptTransition()
createNewAttempt(true);
(5)隨後生成RMAppAttempt對象,根據id等等,把須要的參數加入。
隨後進入RMAppAttemptImpl類的狀態機,實現類是RMAppAttemptImpl
根據其狀態機轉變從RMAppAttemptState.NEW到RMAppAttemptState.SUBMITTED
transition類是AttemptStartedTransition類。
首先獲取時間戳
進入ApplicationMasterService,該Service目的是溝通ApplicationMaster和ResourceManager。
registerAppAttempt註冊該ApplicationAttempt。
而後進入scheduler階段
(6)在Scheduler階段,首先是APP_ADDED
先無論內部邏輯,隨後又進入到RMAppAttemptImpl中得狀態轉變
(7)EventType是RMAppAttemptEventType.APP_ACCEPTED,執行的transition類爲ScheduleTransition類
它的行爲是將首先將RMAppimpl的狀態從submit調整到APP_ACCEPTED,沒有行爲。
隨後在scheduler中分配資源,返回一個allocate對象。
至此client結束任務,下一步的任務不須要client參與了。
當NodeManager向ResourceManager彙報心跳的時候,RM會找到須要分配的資源,經過scheduler的方法去分配。在AppSchedulable方法中的assighContainer將該container assign到node中。同時通知該node須要去launch得app。這步是rm 和 nm進行通訊完成的,至關於rm向nm申請ApplicationMaster的Container。
NodeManager與ResourceManager通訊
協議是ResourceTracker,實現類是ResourceTrackerService