概述

前面已经分析了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协议,因此RM和AM可以通过RPC调用startContainers方法命令NM启动相应的Container。在NM的startContainers方法中,会创建ApplicationImpl对象,初始状态为NEW。

INITING,

在NM的startContainers方法中,生成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事件,然后设置ApplicationImpl为INITING。

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

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通知NM,NM结束服务然后通知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_RESOURCES和AuxServicesEventType.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

[NM 状态机1] Application状态机详解的更多相关文章

  1. SpringBoot配置文件 application.properties详解

    SpringBoot配置文件 application.properties详解   本文转载:https://www.cnblogs.com/louby/p/8565027.html 阅读过程中若发现 ...

  2. [转]application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...

  3. application.properties详解 --springBoot配置文件【转载】

    # spring boot application.properties配置的各个属性详解 # 该示例文件作为标准提供.(官方文档 翻译过来的) # 还是花了些功夫翻译,各位如果转发,请留下本文地址, ...

  4. application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...

  5. springboot集成freemarker 配置application.properties详解

    #配置freemarker详解 #spring.freemarker.allow-request-override=false # Set whether HttpServletRequest att ...

  6. Spring Boot属性配置文件:application.properties 详解

    学习资料 网址 官方说明文档 https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-pro ...

  7. HTML5应用程序缓存Application Cache详解

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  8. Delphi Application.MessageBox详解

    引数:1. Text:要显示的讯息2. Caption:讯息视窗的标题列文字3. Flags:讯息旗标     3.1. 可指定讯息视窗上的图示     3.2. 可指定讯息视窗出现的按钮     3 ...

  9. application:didFinishLaunchingWithOptions:详解

    iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有 ...

随机推荐

  1. PASCAL 的开源工具

    PASCAL 的开源工具: 1)free pascal  代码编译器     http://www.freepascal.org/ 2)lazarus 图形界面开发工具   http://www.la ...

  2. java >>> 和 >>>=的区别

    java >> 和 >>> 以及 >>>= 的区别 可能大家都知道java中>> 和 >>> 的区别,那这里我也啰嗦一下, ...

  3. linux下编译运行C程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C.C++.Ada.Fortran.Objective.Perl.Python.Ruby以及Ja ...

  4. Tile based Rendering 二 tbr and tbdr 优化建议tiled based deferred rendering

    http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf tbr 和tbdr ...

  5. 详解vue静态资源打包中的坑与解决方案

    本文主要解决: 1.vue-cli默认配置打包后部署至特定路径下静态资源路径错误问题; 2.静态资源打包使用相对路径后css文件引入图片路径错误问题. 一.问题 vue-cli 脚手架生成的默认打包配 ...

  6. Linux下解压tar.xz文件

    xz -d glib-2.14.tar.xz tar -xvf glib-2.14.tar 前面一个是将xz文件解压成tar文件,后面一个是将tar文件解压. xz使用格式:压缩: xz -z fil ...

  7. 使用VisualSVN建立SVN服务器

    原地址:http://blog.csdn.net/happyjiang2009/article/details/5719988 以前使用官方Subversion搭建SVN版本控制环境,感觉很繁琐,需要 ...

  8. php抽象类和接口的异同【转】

    1. 相同点: (1)      两者都是抽象类,都不能实例化. (2)      interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法. 2. 不同点: ...

  9. 理解Linux系统中的load average

    理解Linux系统中的load average(图文版) 博客分类: Linux linux load nagios  一.什么是load average? linux系统中的Load对当前CPU工作 ...

  10. 学会Git玩转Github笔记(二)——Git使用

    一.Git基本工作流程 Git工作区域 向仓库中添加文件流程 二. Git初始化及仓库创建和操作 基本信息设置 . 设置用户名 git config --global user.name 'itcas ...