概述

前面已经分析了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. [Java基础] java的守护线程与非守护线程

    最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ...

  2. 央行mlf,SLF,PSL,MLF,SLO

    央行mlf是什么意思 中国人民银行 中国人民银行(The People's Bank Of China,英文简称PBOC),简称央行,是中华人民共和国的中央银行,中华人民共和国国务院组成部门.在国务院 ...

  3. PL/SQL如何远程连接ORACLE

    如何在没有装ORACLE的电脑上用PLSQL远程连接ORACLE 下载instantclient,我的是WIN7,下载的是instantclient-basiclite-nt-12.1.0.1.0.z ...

  4. dedecms入侵拿webshell之方法总结

    1.注入漏洞 存在注入地址:在域名下输入plus/digg_frame.php?action=good&id=1024%651024&mid=*/eval($_POST[x]);var ...

  5. FPGA作为从机与STM32进行SPI协议通信---Verilog实现

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  6. Hive不等值连接

    select * from ( select t1.instalment_id as r_id , t2.instalment_id as p_id from (select instalment_i ...

  7. promise对象解决回调地狱

    先放一张图片感受一下回调地狱 看起来是真的很让人头痛的东西 而现在我这里使用promise对象来解决回调地狱 采用链式的 then,可以指定一组按照次序调用的回调函数. 这时,前一个 then 里的一 ...

  8. 【转】php中的会话机制(2)

    原文:https://segmentfault.com/a/1190000000468220 发现,在调用session_start()的时候, session_start() 里面应该是有调用类似 ...

  9. 爪哇国新游记之十四----初试JDBC

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  10. 图片转为byte[]、String、图片之间的转换

    package com.horizon.action; import java.io.ByteArrayOutputStream; import java.io.File; import java.i ...