应用程序在YARN中的整体运行流程和状态机 (NodeManager端)

在上一篇应用程序在YARN中的整体运行流程和状态机 (ResourceManager端)我们详细分析了,应用程序在RM端的状态机变迁,掠过了在NodeManager部分,这篇文章我们详细分析,作业运行流程中在NodeManger上面的状态机变迁包括:Container的资源本地化过程,Container启动过程,Container运行结束后的清理过程。

  1. 发起NodeManager上面的容器运行首先,调用ContainerManagerImpl的startContainers方法,向ApplicationImpl对象发出ApplicationEventType.INIT_APPLICATION事件,从而ApplicationImpl进入INITING状态,然后向ApplicationImpl对象发出ApplicationEventType.INIT_CONTAINER事件,而ApplicationImpl的状态维持不变,只是把Container加入到对应的集合中。

  2. ApplicationEventType.INIT_APPLICATION事件的伴随函数,向LogAggregationService发送APPLICATION_STARTED事件。

  3. 在日志聚合处理成功的情况下向ApplicationImpl对象发出APPLICATION_LOG_HANDLING_INITED事件。ApplicationImpl的状态机保持不变,还是INITING。

  4. APPLICATION_LOG_HANDLING_INITED事件的伴随函数中,向 ResourceLocalizationService对象发送LocalizationEventType.INIT_APPLICATION_RESOURCES事件。

  5. 然后ResourceLocalizationService收到此事件,分别创造私有的和app级别的LocalResourcesTrackerImpl对象,加入到对应的数据结构中去。然后向ApplicationImpl发送APPLICATION_INITED事件。然后ApplicationImpl变为RUNNING状态。

  6. APPLICATION_INITED事件的伴随函数中,向ContainerImpl发送INIT_CONTAINER事件,然后向AuxServices发送CONTAINER_INIT事件,和APPLICATION_INIT事件,然后向ResourceLocalizationService发送INIT_CONTAINER_RESOURCES事件。

  7. 收到INIT_CONTAINER_RESOURCES事件的ResourceLocalizationService向对应的LocalResourcesTrackerImpl,(三种情况,public资源,user级别private资源,application级别资源)对象发送ResourceEventType.REQUEST事件。

  8. LocalResourcesTrackerImpl收到ResourceEventType.REQUEST事件,然后向LocalizedResource对象发出ResourceEventType.REQUEST事件,LocalizedResource从INITING到DOWLOADING状态。

  9. LocalizedResource从INITING到DOWLOADING状态的伴随函数中发送LocalizerEventType.REQUEST_RESOURCE_LOCALIZATION事件给ResourceLocalizationService,然后根据本地化的资源级别,将对应的资源请求加入到对应的下载线程中。具体是:将公共资源的本地化交给PublicLocalizer线程中的FSDownload完成具体文件的下载(公共资源都在RM上面),将非公共资源交给LocalizerRunner线程。

  10. 下载完成的线程会向LocalizedResource对象发送ResourceEventType.LOCALIZED,然后LocalizedResource对象的状态机变为LOCALIZED。

  11. LocalizedResource从DOWNLOADING状态变为LOCALIZED状态的伴随函数中,向ContainerImpl对象发送ContainerEventType.RESOURCE_LOCALIZED事件,然后ContainerImpl的状态机变为LOCALIZED。

  12. ContainerImpl的状态机变为LOCALIZED的伴随函数中,向ResourceLocalizationService发送CONTAINER_RESOURCES_LOCALIZED事件,然后ResourceLocalizationService结束资源本地化过程,关闭本地化相关的服务。

  13. ContainerImpl的状态机转为LOCALIZED的伴随函数中,向ContainersLauncher发送LAUNCH_CONTAINER事件,然后构造启动运行的线程ContainerLaunch对象,加入线程池执行。

  14. ContainerLaunch运行过程中,向ContainerImpl发送CONTAINER_LAUNCHED事件,然后ContainerImpl的状态机转入RUNNING状态。

  15. ContainerImpl转入RUNNING状态的伴随函数中,向ContainersMonitorImpl发送START_MONITORING_CONTAINER事件,ContainersMonitorImpl将该Container加入到监控Container的hash表中,ContainersMonitorImpl开始监控该容器的资源情况。

  16. 在ContainerLaunch线程是一个阻塞线程,发送完LAUNCH_CONTAINER事件后,利用ContainerExecutor的对象exec,执行启动对应的命令行。(有三种类型的ContainerExecutor:DefaultContainerExecutor, DockerContainerExecutor, LinuxContainerExecutor)执行脚本成功并结束后,向ContainerImpl发送CONTAINER_EXITED_WITH_SUCCESS事件,然后ContainerImpl的状态机转为EXITED_WITH_SUCCESS状态。

  17. ContainerImpl的状态机转为EXITED_WITH_SUCCESS状态的伴随函数中,向ContainersLauncher发送CLEANUP_CONTAINER事件,容器运行结束后的一些相关的清除工作。并且,向ResourceLocalizationService发送CLEANUP_CONTAINER_RESOURCES事件。

  18. ResourceLocalizationService收到CLEANUP_CONTAINER_RESOURCES事件后,先向ResourceLocalized对象发送ResourceEventType.RELEASE事件,然后删除需要本地化队列中的该容器代表,然后ResourceLocalizationService本身和该Container相关的一些清理工作,然后向ContainerImpl发送CONTAINER_RESOURCES_CLEANEDUP事件,然后ContainerImpl转入DONE状态。

  19. ContainerImpl转入DONE状态的伴随函数中,依次分别向ApplicationImpl发送APPLICATION_CONTAINER_FINISHED事件,ApplicationImpl依然是RUNNING状态,伴随操作是将该Container从hash表中删除。向ContainersMonitorImpl发送STOP_MONITORING_CONTAINER事件,ContainersMonitorImpl将该容器加入到待删除List中。向LogAggregationService发送CONTAINER_FINISHED事件,记录该容器相关的日志。

状态机图如下:
在这里插入图片描述

发布了14 篇原创文章 · 获赞 4 · 访问量 5676

猜你喜欢

转载自blog.csdn.net/weixin_35792948/article/details/86351117
今日推荐