摘要

本文详细描述RMAppAttempt状态机内的状态与其转换关系,分析的代码基于Apache社区Hadoop最新的2.3.0版本。

RMAppAttempt状态机

在RM中,一个RMApp可能对于一到多个RMAppAttempt,即假如RMApp的第一个RMAppAttempt失败后,RM会根据配置启动新的RMAppAttempt。

RMAppAttempt内部维护了进度,运行的机器信息,起始时间,URL等信息。其中最复杂的信息是RMAppAttempt的状态机信息。

  private static final StateMachineFactory<RMAppAttemptImpl,
RMAppAttemptState,
RMAppAttemptEventType,
RMAppAttemptEvent>
stateMachineFactory = new StateMachineFactory<RMAppAttemptImpl,
RMAppAttemptState,
RMAppAttemptEventType,
RMAppAttemptEvent>(RMAppAttemptState.NEW) // Transitions from NEW State
.addTransition(RMAppAttemptState.NEW, RMAppAttemptState.SUBMITTED,
RMAppAttemptEventType.START, new AttemptStartedTransition())

图1 RMAppAttempt状态机

RMAppAttempt状态与转换解释

这里讨论的重点在于用户提交App后RM正常的处理流程,时先不讨论RECOVERY部分,因为其状态转换原理是相同的,可以自行查看代码分析。

NEW,

和RMApp的状态机一样,RMAppAttempt的初始状态也是NEW。

在RMApp由NEW_SAVING转换为RMAppState.SUBMITTED时,RMApp会创建RMAppAttemptImpl对象,这时RMAppAttempt状态为NEW。

SUBMITTED,

表示RMAppAttempt已经创建,并准备给调度器。

在RMApp创建RMAppAttempt时会创建一个RMAppAttemptEventType.START事件,交给处理器,RMAppAttempt在NEW的状态下遇到RMAppAttemptEventType.START事件时,转化为SUBMITTED状态,并调用AttemptStartedTransition。

SCHEDULED,

表示该RMAppAttempt已经交给调度器,做好了调度的准备。

AttemptStartedTransition中,RMAppAttempt会创建AppAttemptAddedSchedulerEvent事件,该事件最终会传递给调度器;调度器把相应的RMAppAttempt放到待调度的组中,然后创建RMAppAttemptEventType.APP_ACCEPTED事件,这个事件会使RMAppAttempt调用ScheduleTransition,在ScheduleTransition中,根据该App是否为UnmanagedAM(AM是否被RM管理,UnmanagedAM由客户端负责启动,然后向RM注册;managedAM由RM命令NM启动,并负责该AM的生命周期)决定返回LAUNCHED_UNMANAGED_SAVING或SCHEDULED状态,如果是managedAM(大多数情况)返回SCHEDULED,否则返回LAUNCHED_UNMANAGED_SAVING状态。

ALLOCATED_SAVING,

表示正在保存RMAppAttemptImpl信息到RMStateStore中。

当某个NM(NodeManager)发送心跳到RM,RM会给改RM分配相应的container,这时候会创建RMContainerEventType.START事件,在RMContainerImpl状态机(后续将会介绍)遇到这个事件时会调用ContainerStartedTransition,在其转换方法中会创建RMAppAttemptEventType.CONTAINER_ALLOCATED事件,而RMAppAttemptImpl(SCHEDULED状态)遇到SCHEDULED事件后会调用AMContainerAllocatedTransition,这时会把RMAppAttemptImpl信息存储到制定的存储器中。RMAppAttempt状态转换为ALLOCATED_SAVING。

ALLOCATED,

表示RMAppAttempt已经完成调度到某台NM上的工作。

当RMStateStore完成RMAppAttemptImpl信息的存储后,会创建RMAppAttemptEventType.ATTEMPT_NEW_SAVED事件,RMAppAttemptImpl遇到此事件后会调用AttemptStoredTransition,检查存储是否出错,并创建AMLauncherEventType.LAUNCH事件,然后把状态转换为ALLOCATED。

LAUNCHED,

表示RM已经发送命令让某台NM启动相应的AM。

在AMLauncher中,处理AMLauncherEventType.LAUNCH事件,实际的方法lanch()方法中,AM首先连接上相应的NM,然后通过相应的协议让NM启动AM。完成后生成RMAppAttemptEventType.LAUNCHED事件。RMAppAttemptImpl处理此事件,调用AMLaunchedTransition,然后转换状态为LAUNCHED。

RUNNING,

AM成功向RM注册后的状态。

AM启动后会向RM注册,注册的时候RM会生成RMAppAttemptEventType.REGISTERED事件,RMAppAttemptImpl处理这个事件,调用AMRegisteredTransition,获取AM的host,port,URL等信息,创建RMAppEventType.ATTEMPT_REGISTERED事件,然后把RMAppAttemptImpl状态转换为RUNNING。

LAUNCHED_UNMANAGED_SAVING,

Unmanaged AM正在保存状态,见SCHEDULED状态。

FINAL_SAVING,

表示正在保存RMAppAttemptImpl的最终信息。

这个状态类似于RMApp的FINAL_SAVING状态,即为了保证存RMAppAttemptImpl信息,在转换为FINISHED,FAILED,FINISHING,KILLED前增加这个状态,在转换为FINAL_SAVING前,需要保存RMAppAttemptImpl的 targetedFinalState状态,在RMStateStore完成相应存储后根据targetedFinalState转化为后续的状态。

FINISHING,

表示RMAppAttemptImpl正在结束。

遇到RMAppAttemptEventType.EXPIRE或AM的RMAppAttemptEventType.CONTAINER_FINISHED事件时,RMAppAttemptImpl状态转换为FINISHED

FINISHED,

表示RMAppAttemptImpl已经结束。

只有AM主动汇报自己结束的RMAppAttempt才会标识为FINISHED状态。

FAILED,

表示RMAppAttemptImpl已经失败。

失败的情况比较多,这里不再一一介绍。

KILLED,

表示RMAppAttemptImpl已经被kill。

客户端发起KILL会导致RMAppAttemptImpl被KILL。

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

[RM 状态机详解2] RMAppAttempt状态机详解的更多相关文章

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

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

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

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

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

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

  4. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  5. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  6. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

  7. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  8. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  9. Linux的压缩解压命令快速上手——解压篇

    在Linux系统中,压缩文件通常是先将若干文件(包括目录)打包成一个tar文件,然后再调用压缩程序将tar文件压缩成相应的压缩包,这也就是为什么Linux系的压缩包的后缀通常都是像tar.gz,tar ...

随机推荐

  1. Codeforces548D:Mike and Feet(单调栈)

    Mike is the president of country What-The-Fatherland. There are n bears living in this country besid ...

  2. C#/.NET code

    Some practices to write better C#/.NET code(译) C#(.NET)中有关编码的一些建议,原文地址:http://www.codeproject.com/Ar ...

  3. 【设计模式】Abstract Factory模式

    抽象工厂模式是工厂方法模式的进一步强化.当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以. 可是.当用户程序须要创建多种类型的产品,而这些产品又有一定的内 ...

  4. MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦

    原文:MVC使用百度开源文本编辑器UEditor实现图文并茂,字数限制,上传图片或涂鸦 文本编辑器有很多,比如ticymce和CKEditor就比较好用,但涉及到图片.文件上传,需要结合CKFinde ...

  5. sqlserver检测数据库是否能连接的小技巧

    有时候可能需要检测下某台机器的服务是不是起来了,或者某台机器的某个库是不是能被连接又不能打开ssms也不想登陆服务器的话就可以用这个方法. 1.在桌面上右键创建个文本,然后改后缀名为udl以后保存(1 ...

  6. 接口自动化测试:参数化封装(excel文件读取)

    log4j.properties文件配置 log4j.rootLogger = DEBUG,stdout,F log4j.appender.stdout = org.apache.log4j.Cons ...

  7. php错误及异常捕捉

    原文:php错误及异常捕捉 在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的. 所以引用以下几中函数. a)   set_error_handler 一般用于捕捉  E_NOTI ...

  8. JavaEE——Intellij Idea 创建JavaWeb项目

    原文:JavaEE--Intellij Idea 创建JavaWeb项目 折腾Tomcat折腾了两个晚上,第一个晚上怎么都进不了Tomcat的首页,第二个晚上进去了,但是新建的Web项目,在浏览器中运 ...

  9. jQuery实现表格行的动态增加与删除

    删除之前删除2行后: 1<script> 8 $(document).ready(function(){ 9 //<tr/>居中 10 $("#tab tr" ...

  10. HEAP CORRUPTION DETECTED

    发生主要是由于这个问题给写入超出预分配的空间,注意检查越界情况 版权声明:本文博客原创文章,博客,未经同意,不得转载.