发起NodeManager上面的容器运行首先,调用ContainerManagerImpl的startContainers方法,向ApplicationImpl对象发出ApplicationEventType.INIT_APPLICATION事件,从而ApplicationImpl进入INITING状态,然后向ApplicationImpl对象发出ApplicationEventType.INIT_CONTAINER事件,而ApplicationImpl的状态维持不变,只是把Container加入到对应的集合中。
ApplicationEventType.INIT_APPLICATION事件的伴随函数,向LogAggregationService发送APPLICATION_STARTED事件。
在日志聚合处理成功的情况下向ApplicationImpl对象发出APPLICATION_LOG_HANDLING_INITED事件。ApplicationImpl的状态机保持不变,还是INITING。
APPLICATION_LOG_HANDLING_INITED事件的伴随函数中,向 ResourceLocalizationService对象发送LocalizationEventType.INIT_APPLICATION_RESOURCES事件。
然后ResourceLocalizationService收到此事件,分别创造私有的和app级别的LocalResourcesTrackerImpl对象,加入到对应的数据结构中去。然后向ApplicationImpl发送APPLICATION_INITED事件。然后ApplicationImpl变为RUNNING状态。
APPLICATION_INITED事件的伴随函数中,向ContainerImpl发送INIT_CONTAINER事件,然后向AuxServices发送CONTAINER_INIT事件,和APPLICATION_INIT事件,然后向ResourceLocalizationService发送INIT_CONTAINER_RESOURCES事件。
收到INIT_CONTAINER_RESOURCES事件的ResourceLocalizationService向对应的LocalResourcesTrackerImpl,(三种情况,public资源,user级别private资源,application级别资源)对象发送ResourceEventType.REQUEST事件。
LocalResourcesTrackerImpl收到事件,然后向LocalizedResource对象发出事件,LocalizedResource从INITING到DOWLOADING状态。
LocalizedResource从INITING到DOWLOADING状态的伴随函数中发送LocalizerEventType.REQUEST_RESOURCE_LOCALIZATION事件给ResourceLocalizationService,然后根据本地化的资源级别,将对应的资源请求加入到对应的下载线程中。具体是:将公共资源的本地化交给PublicLocalizer线程中的FSDownload完成具体文件的下载(公共资源都在RM上面),将非公共资源交给LocalizerRunner线程。
下载完成的线程会向LocalizedResource对象发送,然后LocalizedResource对象的状态机变为LOCALIZED。
LocalizedResource从DOWNLOADING状态变为LOCALIZED状态的伴随函数中,向ContainerImpl对象发送ContainerEventType.RESOURCE_LOCALIZED事件,然后ContainerImpl的状态机变为LOCALIZED。
ContainerImpl的状态机变为LOCALIZED的伴随函数中,向ResourceLocalizationService发送CONTAINER_RESOURCES_LOCALIZED事件,然后ResourceLocalizationService结束资源本地化过程,关闭本地化相关的服务。
ContainerImpl的状态机转为LOCALIZED的伴随函数中,向ContainersLauncher发送LAUNCH_CONTAINER事件,然后构造启动运行的线程ContainerLaunch对象,加入线程池执行。
ContainerLaunch运行过程中,向ContainerImpl发送CONTAINER_LAUNCHED事件,然后ContainerImpl的状态机转入RUNNING状态。
ContainerImpl转入RUNNING状态的伴随函数中,向ContainersMonitorImpl发送START_MONITORING_CONTAINER事件,ContainersMonitorImpl将该Container加入到监控Container的hash表中,ContainersMonitorImpl开始监控该容器的资源情况。
在ContainerLaunch线程是一个阻塞线程,发送完LAUNCH_CONTAINER事件后,利用ContainerExecutor的对象exec,执行启动对应的命令行。(有三种类型的ContainerExecutor:DefaultContainerExecutor, DockerContainerExecutor, LinuxContainerExecutor)执行脚本成功并结束后,向ContainerImpl发送CONTAINER_EXITED_WITH_SUCCESS事件,然后ContainerImpl的状态机转为EXITED_WITH_SUCCESS状态。
ContainerImpl的状态机转为EXITED_WITH_SUCCESS状态的伴随函数中,向ContainersLauncher发送CLEANUP_CONTAINER事件,容器运行结束后的一些相关的清除工作。并且,向ResourceLocalizationService发送CLEANUP_CONTAINER_RESOURCES事件。
ResourceLocalizationService收到CLEANUP_CONTAINER_RESOURCES事件后,先向ResourceLocalized对象发送事件,然后删除需要本地化队列中的该容器代表,然后ResourceLocalizationService本身和该Container相关的一些清理工作,然后向ContainerImpl发送CONTAINER_RESOURCES_CLEANEDUP事件,然后ContainerImpl转入DONE状态。
ContainerImpl转入DONE状态的伴随函数中,依次分别向ApplicationImpl发送APPLICATION_CONTAINER_FINISHED事件,ApplicationImpl依然是RUNNING状态,伴随操作是将该Container从hash表中删除。向ContainersMonitorImpl发送STOP_MONITORING_CONTAINER事件,ContainersMonitorImpl将该容器加入到待删除List中。向LogAggregationService发送CONTAINER_FINISHED事件,记录该容器相关的日志。