zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    关于prototype学习
    java io 从文件的读取和输入
    java 匿名内部类
    动手做个 AI 机器人,帮我回消息!
    几个高效做事的法则,让你的一天有 25 小时
    爆肝一个月,我做了个免费的面试刷题网
    Log4j 被曝核弹级漏洞,开发者炸锅了!
    几个超火的编程网站,别错过!
    Java 处理表格,真的很爽!
    c++智能指针转化:static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast
  • 原文地址:https://www.cnblogs.com/shenh062326/p/3591129.html
Copyright © 2011-2022 走看看