• [NM 状态机1] Application状态机详解


    概述

        前面已经分析了RM的状态机,接下来将分析NM的状态机,NM状态机包括Container,Application,LocalizedResource三个。首先我们分析Application的状态机。

        NodeManager维护着本节点执行的Application,从图1中可以看出其维护了user,containers,AppId和状态信息。Application的实现类为ApplicationImpl。图2展示了Application的状态机。

     

     

    图1 Application接口

    图2 Application状态机图

    Application状态转换与解释

    NEW,

        NM中,ContainerManagerImpl实现了ContainerManagementProtocol协议,因此RMAM可以通过RPC调用startContainers方法命令NM启动相应的Container。在NMstartContainers方法中,会创建ApplicationImpl对象,初始状态为NEW

    INITING,

        NMstartContainers方法中,生成ApplicationImpl对象后,会创建ApplicationEventType.INIT_APPLICATION事件,ApplicationImpl调用AppInitTransition处理此事件,然后设置状态为INITING

    RUNNING,

        需要经过两部初始化才能到RUNNING状态。分别为初始化HDFS和本地目录。

        AppInitTransition中,会创建LogHandlerEventType.APPLICATION_STARTED事件,LogHandler会处理此事件,实际上,做为LogHandler的实现类,LogAggregationService初始化App的主要工作是创建目录(一般是HDFS上,通过remoteFS.getWorkingDirectory()方法或得相应目录)和初始化AppAggregator(负责收集container的日志并存储到HDFS上),结束初始化工作后创建ApplicationEventType.APPLICATION_LOG_HANDLING_INITED事件。ApplicationImpl调用AppLogInitDoneTransition处理此事件,期间创建LocalizationEventType.INIT_APPLICATION_RESOURCES事件,然后设置ApplicationImplINITING

        ResourceLocalizationService负责处理LocalizationEventType.INIT_APPLICATION_RESOURCES事件,即初始化本地目录,然后创建ApplicationEventType.APPLICATION_INITED事件,ApplicationImpl调用AppInitDoneTransition处理此事件,这时候为App下的每个container创建ContainerEventType.INIT_CONTAINER事件,最后设置ApplicationImplRUNNING

    FINISHING_CONTAINERS_WAIT,

        如果RM返回给NM心跳信息显示该App属于appsToCleanup列表,或者NM自己停止服务,这时候会创建ApplicationEventType.FINISH_APPLICATION事件,ApplicationImpl调用AppFinishTriggeredTransition处理此事件,如果该App没有container,则ApplicationImpl状态被置为ApplicationState.APPLICATION_RESOURCES_CLEANINGUP;负责为每个container创建ContainerEventType.KILL_CONTAINER事件,然后设置ApplicationImpl的状态为ApplicationState.FINISHING_CONTAINERS_WAIT

        这里解释一下,为什么结束的触发是NM结束服务和RM通知NMNM结束服务然后通知App很容易理解,但是正常情况下为什么是RM通知NM结束相应的App,这时因为如果ApplicationMaster结束后,RM知道此信息,然后通知NM应该通知这个App对应的container

    APPLICATION_RESOURCES_CLEANINGUP,

        container结束的时候,会创建APPLICATION_CONTAINER_FINISHED事件,ApplicationImpl会调用AppFinishTransition处理此事件,如果此时App下没有container,那么设置ApplicationImpl状态为APPLICATION_RESOURCES_CLEANINGUP,负责设置为FINISHING_CONTAINERS_WAIT

    FINISHED

        在设置ApplicationImpl状态为APPLICATION_RESOURCES_CLEANINGUP前,ApplicationImpl会创建LocalizationEventType.DESTROY_APPLICATION_RESOURCESAuxServicesEventType.APPLICATION_STOP事件,ResourceLocalizationService负责负责DESTROY_APPLICATION_RESOURCES事件,它使用异步方式删除本地App的临时文件,如appcache,nmPrivate等相应的目录。然后生成ApplicationEventType.APPLICATION_RESOURCES_CLEANEDUP事件,ApplicationImpl调用AppCompletelyDoneTransition处理此事件,期间生成LogHandlerEventType.APPLICATION_FINISHED事件,然后设置ApplicationImpl状态为FINISHED

    转载请注明出处:http://www.cnblogs.com/shenh062326/p/3591129.html

  • 相关阅读:
    svn的安装方法
    在powerDesigner中通过SQL生成pdm
    关于文件下载
    关于ClassPath的思考
    重读Spring之ConfigurationClassPostProcessor-改正错误
    SpringBoot自动装配原理
    SpringMVC之json是怎么传回前端的 @ResponseBody解析
    consumer配置参数之max.poll.interval.ms
    SpringMVC 之处理请求
    使用SpringMVC遇到的坑
  • 原文地址:https://www.cnblogs.com/shenh062326/p/3591129.html
Copyright © 2020-2023  润新知