job运行流程(2)---ResourceManager调度job
6、接着上篇文章中的最后一步:ResourceManager服务端执行ClientRMService.submitApplication(),接着开始调用RMAppManager.submitApplication()进而来触发RMAppEvent事件,成为job调度运行事件触发的源头;
(本系列文章主要分析job调度运行流程的主要事件流程,像其它的日志读写事件流程、container监控流程等并没有包括在内)
7、接着触发了RMAppImpl.handle(),这其中注册了多种状态转换机制,负责RMAppState的各种状态转换;
8、ResourceManager服务启动初始化时会启动一个线程,循环处理container的调度分配,具体过程如下:
ResourceManager.serviceInit->ResourceManager.RMActiveServices.serviceInit
->ResourceManager.createScheduler->ResourceScheduler(默认为CapacityScheduler).reinitialize()
->CapacityScheduler.AsyncScheduleThread.start()
然后循环处理各个nodemanager上面的containers资源分配
CapacityScheduler.schedule()->CapacityScheduler.allocateContainersToNode()
->LeefQueue.assignContainers()->LeefQueue.assignContainersOnNode()
->LeefQueue.assignContainer()->FiCaSchedulerApp.allocate()->RMContainerImpl.handle(RMContainerEventType.START)
更新状态RMContainerState.NEW->RMContainerState.ALLOCATED
9、接着后面会触发RMAppAttemptImpl.handle(),这其中和RMAppImpl类似,同样注册了多种状态转换机制,负责RMAppAttemptState的各种状态转换;
10、接着后面会触发RMContainerImpl.handle(),同样注册了多种状态转换机制,负责RMContainerState的各种状态转换,这里会触发RMAppAttemptEventType.CONTAINER_ALLOCATED事件,进而开始触发ApplicationMasterLaunch相关事件,至此完成了YARN中的ResourceManager端的job调度流程;
整个流程如下图所示: