概述

前面已经分析了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. [你必须知道的.NET]第二十七回:interface到底继承于object吗?

    发布日期:2009.03.05 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 在.NET世界里,我们常常听到的一句话莫过于“S ...

  2. 走进 MvvmLight for Xamarin.Forms

    一.Xamarin.Forms 不使用框架时的绑定 需要注意的是BindingContent,不是DataContent <ContentPage xmlns="http://xama ...

  3. vue模糊搜索&select取值

    之前vue1.0的过滤器真的很好使,但是作者为了不让搬运工变得太菜.硬是砍去了过滤器,为此,我还哭了好一阵,终于,一点一点的弄明白了过滤器是怎么回事后,也学明白了vue里的属性监听器computed以 ...

  4. thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成

    目录 1.案例 1.1图片上传  1.2进行图片木马检测   1.3缩略图生成   1.4控制器中调用缩略图生成方法 1.案例 前言:在thinkphp框架的Thinkphp/Library/Thin ...

  5. Oracle常用常考集合

    登陆远程服务器 sqlplus scott/tiger@192.168.2.1[:port]/sid [as sysdba] 简单查询 select  table_name from user_tab ...

  6. HttpClient不同版本超时时间的设置

    引自 https://www.cnblogs.com/hisunhyx/p/5028391.html 3.X是这样的 HttpClient client=new DefaultHttpClient() ...

  7. Friends number NBUT - 1223 (暴力打表)

    Paula and Tai are couple. There are many stories between them. The day Paula left by airplane, Tai s ...

  8. 【UOJ #279】【UTR #2】题目交流通道

    http://uoj.ac/problem/279 先判断答案为0的情况,\(d(i,i)\neq 0\),\(d(i,j)\neq d(j,i)\),\(d(i,j)>d(i,k)+d(k,j ...

  9. NOIP2018训练题集

    1. CZday3C 给定有m个数的集合,从其中任选一个子集满足全部&后不为零,问方案数. 考虑对二进制位容斥,问题转化为求包含某个二进制位集合的数的个数,通过类似FMT的DP求解. #inc ...

  10. hdu 1529 Cashier Employment(差分约束)

    Cashier Employment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...