概述

前面已经分析了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. 一次cloudstack启动cloudstack-agent报错的处理过程

    http://www.bubuko.com/infodetail-2397888.html

  2. IA32系统级架构总览(二)

    系统级架构由寄存器.数据结构.指令组成,这些设计对基本的系统级别的操作提供了支持,比如:内存管理.终端与异常处理.任务管理.多进程控制等. 我们先来看一看寄存器与数据结构的总汇图:现在你可能看不懂,不 ...

  3. netcore 配置文件使用

    一直在记录整理接口调用,但是最近发现关于项目在vs中本地启动也有许多方便的地方. 首先由于使用的是Java的Eureka和网关来做的服务基础, 然后服务就涉及到注册一说, 问题是,如果appsetti ...

  4. R语言平均值和加权平均值

    > a=c(,,) > mean(a) #平均值 [] > wt=c(,,) > weighted.mean(a,wt) #加权平均值 []

  5. Lucene.Net无障碍学习和使用:搜索篇

    一.初步认识搜索 先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现: private TopDocs Search(string keyword,string field) { TopDocs ...

  6. 【SQL】oralce中使用group by和case when按照条件求和

    假设我们有一个Salary 薪水表.这个表的字段分别为:id, name, salary, level  在这个表中,每个人有不同的级别(level).我们要根据不同的级别统计相同级别员工的薪水总和. ...

  7. 循序渐进PYTHON3(十三) --3-- DJANGO之FORM表单(为自动生成的HTML标签添加样式)

    views.py from django.shortcuts import render,HttpResponse from django import forms import json impor ...

  8. DelegatingFilterProxy干了什么?

    org.springframework.web.filter.DelegatingFilterProxy 一般情况,创建一个Filter是交给自己来实现的.基于servlet规范,在web.xml中配 ...

  9. 洛谷——P1744 采购特价商品

    P1744 采购特价商品 题目背景 <爱与愁的故事第三弹·shopping>第一章. 题目描述 中山路店山店海,成了购物狂爱与愁大神的“不归之路”.中山路上有n(n<=100)家店, ...

  10. DHCP拒绝服务攻击工具DHCPig

    DHCP拒绝服务攻击工具DHCPig   DHCP服务负责网络的IP分配服务.通过攻击该服务,可以导致网络内主机获取不到IP,而无法正常使用网络.Kali Linux提供一款专用工具DHCPig.该工 ...