概述

前面已经分析了RM的状态机,接下来将分析NM的状态机,NM状态机包括Container,Application,LocalizedResource三个,其中Container相对较复杂。现在我们分析Container的状态机。另外3展示了LocalizedResource的状态机图,由于其状态机比较简单,这里不再详细分析,读者可以自行查看相关代码。本文的分析基于社区Apache Hadoop最新的2.3.0版本。

NodeManager维护着本节点执行的任务(container),从图1中可以看出其维护了containerID,user,resource等信息。Container的实现类为ContainerImpl。图2展示了container的状态机。

图1 container接口

图2 Container状态机图

图3 LocalizedResource状态机图

Container状态转换与解释

NEW,

在NM中,ContainerManagerImpl实现了ContainerManagementProtocol协议,因此RM和AM可以通过RPC调用startContainers方法命令NM启动相应的Container。在NM的startContainers方法中,会创建一个ContainerImpl对象,且其状态被初始化为NEW。

LOCALIZING,

有两个地方会使ContainerImpl的状态转换为LOCALIZING。1.当ApplicationImpl初始化结束时调用AppInitDoneTransition,这时会为Application下的每个container创建ContainerEventType.INIT_CONTAINER事件,ContainerImpl处理此事件并设置自己状态为LOCALIZING(或LOCALIZED,LOCALIZATION_FAILED)。2. 但NM通过RPC调用startContainers方法命令NM启动container时,假如container对应的Application已经处于RUNNING(即初始化已经完成),这时NM会创建ContainerEventType.INIT_CONTAINER事件,ContainerImpl处理此事件并设置自己状态为LOCALIZING(或LOCALIZED,LOCALIZATION_FAILED)。

另外ContainerImpl处理INIT_CONTAINER事件时会调用RequestResourcesTransition,如果有资源需要本地化,则创建INIT_CONTAINER_RESOURCES事件并进入LOCALIZING状态;如果没有资源需要本地化,则创建LAUNCH_CONTAINER事件并进入LOCALIZED状态;如果遇到不合法的资源请求,则进入LOCALIZATION_FAILED状态。

LOCALIZED,

当需要本地化的资源都已经完成本地化后,ContainerImpl会调用LocalizedTransition,创建LAUNCH_CONTAINER事件并进入LOCALIZED状态。

LOCALIZATION_FAILED,

在本地化资源期间出现异常,则ContainerImpl调用ResourceFailedTransition处理RESOURCE_FAILED事件,清理资源后进入RESOURCE_FAILED状态。

RUNNING,

当ContainerImpl进入LOCALIZED前,都会创建LAUNCH_CONTAINER事件,此事件由ContainersLauncher负责处理,它会生成container的启动命令,设置环境变量等,然后创建CONTAINER_LAUNCHED事件并启动container进程。ContainerImpl会调用LaunchTransition处理此事件,并进入RUNNING状态。

EXITED_WITH_FAILURE,

在ContainersLauncher启动container期间出异常或container结束时返回值不为0,这时候ContainersLauncher会创建CONTAINER_EXITED_WITH_FAILURE事件,ContainerImpl调用ExitedWithFailureTransition处理此事件,进入EXITED_WITH_FAILURE状态。

EXITED_WITH_SUCCESS,

在ContainersLauncher中,如果container正常结束并且返回值为0,则会创建CONTAINER_EXITED_WITH_SUCCESS事件,ContainerImpl调用ExitedWithSuccessTransition处理此事件,进入EXITED_WITH_SUCCESS状态。

KILLING,

但ContainerImpl遇到KILL_CONTAINER事件时,启动清理工作,并进入KILLING状态。

CONTAINER_CLEANEDUP_AFTER_KILL,

当ContainersLauncher准备启动一个container,但此时如果container已经处于KILLING 状态,则创建CONTAINER_KILLED_ON_REQUEST事件,ContainerImpl遇到此事件后进入CONTAINER_CLEANEDUP_AFTER_KILL状态。

DONE

ContainerImpl遇到 CONTAINER_RESOURCES_CLEANEDUP事件会进入DONE状态,即清理已经结束。

小结

至此,ResourceManager和NodeManager相关的状态机已经分析完毕。从这些状态机我们可以看到一个作业从客户端提交到最终结束的流程,与其经历的所有状态。Yarn是在Jobtracker的基础上把作业管理功能从Jobtracker拆分出来,这使得ResourceManager处理NodeManager心跳的时间大大减少,因为它不再需要维护作业信息,而维护作业信息的Jobtracke为此需要进行许多加锁操作;另外由于作业管理已经让ApplicationMaster维护,因此可以实现自定义的ApplicationMaster已支持除MR的计算模型。代码层面上的重构最大的两点在于引入了状态机,这能很方便实现异步操作,提升ResourceManager的性能。

MRApplicationMaster也包含三个状态机,分别是Job,Task,TaskAttempt,由于它不属于Yarn范畴,这里不再对它们做详细的分析,感兴趣的读者可以自行查看代码分析其状态。

附:ContainerImpl相关的事件产生分类:

public enum ContainerEventType {

// Producer: ContainerManager

INIT_CONTAINER,

KILL_CONTAINER,

UPDATE_DIAGNOSTICS_MSG,

CONTAINER_DONE,

// DownloadManager

CONTAINER_INITED,

RESOURCE_LOCALIZED,

RESOURCE_FAILED,

CONTAINER_RESOURCES_CLEANEDUP,

// Producer: ContainersLauncher

CONTAINER_LAUNCHED,

CONTAINER_EXITED_WITH_SUCCESS,

CONTAINER_EXITED_WITH_FAILURE,

CONTAINER_KILLED_ON_REQUEST,

}

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

[NM 状态机2] Container状态机详解的更多相关文章

  1. nm命令中符号类型详解

    摘自http://blog.csdn.net/solmyr_biti/article/details/6565479 nm命令介绍的很多,但大多不介绍其函数符号标志的含义.最近在调试动态库时常用到,其 ...

  2. flutter系列之:flutter中常用的container layout详解

    目录 简介 Container的使用 旋转Container Container中的BoxConstraints 总结 简介 在上一篇文章中,我们列举了flutter中的所有layout类,并且详细介 ...

  3. Docker容器(container)详解 (转载自http://c.biancheng.net/view/3150.html)

  4. [NM 状态机1] Application状态机详解

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

  5. [RM 状态机详解3]RMContainer状态机详解

    摘要 RMContainer是RM内部维护的Container状态.事实上,在RM的调度器中,会维护着一个liveContainers列表,保存着所有存活着的Container信息.图1显示RMCon ...

  6. [RM 状态机详解4] RMNode状态机详解

    摘要 RMNode状态机是ResourceManager的四个状态机(RMApp,RMAppAttempt,RMContainer,RMNode)中最简单的一个,状态机如图1所示.RMNode是Res ...

  7. [RM 状态机详解1] RMApp状态机详解

    概述 Apache Hadoop 2.0在Hadoop 1.0基础上做了许多的重构工作,代码上的重构最大的变化在于引入状态机处理各个角色的状态与变迁,使用状态机是得代码结构更加清晰,方便异步处理各种操 ...

  8. Flutter之Container详解

    1 基本内容1.1 继续关系Object > Diagnosticable > DiagnosticableTree > Widget > StatelessWidget &g ...

  9. [RM HA4] RM状态存储与还原原理详解

    RM状态存储与还原机制详解 转载请注明原始链接http://www.cnblogs.com/shenh062326/p/3562199.html. 摘要 本文基于Apache Hadoop社区最新re ...

随机推荐

  1. Word中截取部分内容并保存为jpg图片的方法

    private void button1_Click(object sender, EventArgs e) { var appWord = new Microsoft.Office.Interop. ...

  2. CSS布局和居中常用技巧

    1.常用居中方法 居中在布局中很常见,我们假设DOM文档结构如下,子元素要在父元素中居中: <div class="parent"> <div class=&qu ...

  3. 四十三 常用内建模块 base64

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

  4. Codeforces 1099 C. Postcard-字符串处理(Codeforces Round #530 (Div. 2))

    C. Postcard time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  5. org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 32; 元素类型为 "key" 的内容必须匹配 "(column)*"

    报错:部分错误信息,主要查看CauseBy Caused by: org.hibernate.InvalidMappingException: Unable to read XML at org.hi ...

  6. Eclipse控制台

    Eclipse中的控制台,是以卡片布局方式来管理的.每运行一个新的程序,创建一个新的控制台,覆盖到原来的控制台之上. 控制台的控制按钮有10个,仅对其中部分作介绍 第1个按钮结束当前程序的运行 第2个 ...

  7. win10安装mysql8.0.15

    1:下载mysql8.0.15 https://www.mysql.com/downloads/ 2:下载完解压,增加my.ini配置文件 [mysqld] # 设置3306端口 port= # 设置 ...

  8. Python开发基础-Day14正则表达式和re模块

    正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...

  9. Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 # yield的表达式形式 def foo(): print('starting') while True: x=yield #默认返回为空,实际上为x=yield No ...

  10. 分享Kali Linux 2017年第30周镜像文件

     分享Kali Linux 2017年第30周镜像文件 Kali Linux官方于7月23日发布2017年的第30周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE ...