作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程。Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件。

作业Job的全部状态维护在类JobStateInternal中,如下所示:

  1. public enum JobStateInternal {
  2. // 作业新建状态,当作业Job被新创建时所处的状态
  3. NEW,
  4. // 作业启动状态,此时运行时间已被设置,任务处于开始被调度阶段
  5. SETUP,
  6. // 作业已初始化状态,此时作业中的Map、Reduce任务均已被创建
  7. INITED,
  8. // 作业正在运行状态,此时作业会为Map、Reduce任务申请资源并进行资源分配,任务被启动,直至全部任务运行完成
  9. RUNNING,
  10. // 作业等待提交最终结果的状态,此时作业运行过程中产生的中间结果已被放置到临时目录中,当全部任务运行完成后,进行最终结果提交,即将临时目录数据提交到最终目录
  11. COMMITTING,
  12. // 作业运行成功状态,此时作业的运行结果被成功提交至最终目录,作业运行成功
  13. SUCCEEDED,
  14. // 等待正在运行的任务被杀死的状态
  15. FAIL_WAIT,
  16. // 作业运行失败将被注销时的状态
  17. FAIL_ABORT,
  18. // 作业运行失败所处的状态
  19. FAILED,
  20. // 作业等待被杀死时所处的状态
  21. KILL_WAIT,
  22. // 作业被注销时所处的状态
  23. KILL_ABORT,
  24. // 作业被杀死后所处的状态
  25. KILLED,
  26. // 作业运行过程中出错后所处的状态
  27. ERROR,
  28. // 作业重启所处状态
  29. REBOOT
  30. }

关于作业状态的详细信息,我们稍后再做介绍,这里,需要特别说明的是,前6种状态是任何一个MapReduce作业成功运行完成都必须经历的状态,而正常情况下一个作业生命周期的变化,如下图所示:

1、NEW——>INITED:由新建NEW状态到已初始化INITED状态

MRAppMaster中作业Job被创建时处于NEW状态,然后MRAppMaster会接着生成一个JOB_INIT事件,交给作业事件分发器jobEventDispatcher处理,如上图所示,实际上就是通过JobImpl中的InitTransition处理,此时作业会由NEW状态转换成INITED状态,当然如果初始化失败作业还是会停留在新建NEW状态;

2、INITED——>SETUP:由已初始化INITED状态到启动SETUP状态

MRAppMaster中等到作业初始化后,即为INITED状态时,MRAppMaster会生成一个JobStartEvent事件,其事件类型为JOB_START,交给事件分发器dispatcher(也就是作业事件分发器jobEventDispatcher)处理,实际上也是通过JobImpl中的StartTransition处理,在其transition()方法内处理完毕后,作业会由已初始化INITED状态转换成启动SETUP状态;

3、SETUP——>RUNNING:由启动SETUP状态到作业正在运行RUNNING状态

在上述StartTransition的transition()方法最后,会生成一个CommitterJobSetupEvent事件并提交给事件分发器dispatcher处理,而CommitterJobSetupEvent事件的类型是JOB_SETUP,其会被交由CommitterEventHandler组件处理,在其内部EventProcessor的handleJobSetup()方法中,针对JOB_SETUP事件处理的方式就是提交一个类型为JOB_SETUP_COMPLETED的JobSetupCompletedEvent事件,也就是上图的JOB_SETUP_COMPLETED,然后就会被交给SetupCompletedTransition处理,其内部会调度Task进行资源申请和分配,并启动相关任务运行,此时Job就会由由启动SETUP状态转换到作业正在运行RUNNING状态;

4、RUNNING——>RUNNING:由作业正在运行RUNNING状态到作业正在运行RUNNING状态

4.1、作业任务运行尝试完成事件JOB_TASK_ATTEMPT_COMPLETED不会导致作业的状态改变;

4.2、作业任务运行完成事件JOB_TASK_COMPLETED,则会在TaskCompletedTransition的transition()方法中,根据作业中任务的整体完成情况,确定作业状态的过渡,比如:

4.2.1、如果作业中任务失败数目,不管是Map还是Reduce任务,超过一定的比例,而作业任务均已完成(或成功或失败),则会将作业状态过渡到FAIL_ABORT状态,并提交CommitterJobAbortEvent事件处理,否则如果任务还尚未全部完成,则会过渡到FAIL_WAIT状态;

4.2.2、如果作业完成数目满足要求,则会将作业状态过渡到COMMITTING状态,否则还是停留在RUNNING状态,等待其他任务完成时再判断;

4.3、作业运行完成事件JOB_COMPLETED也是会通过类似4.2对作业中整体情况进行判断,确定作业运行状态是应该停留在RUNNING状态,还是应该过渡到COMMITTING状态,这个是在JobNoTasksCompletedTransition的transition()方法中进行判断的。

5、RUNNING——>COMMITTING:由作业正在运行RUNNING状态到作业等待提交最终结果COMMITTING状态

由JOB_TASK_COMPLETED和JOB_COMPLETED事件触发,具体参加上述4的分析,这里不再赘述;

6、COMMITTING——>SUCCEEDED:由作业等待提交最终结果COMMITTING状态到作业成功状态

由JOB_COMMIT_COMPLETED事件触发,并由CommitSucceededTransition处理,详情以后再做分析。

关于作业状态机的全部过渡流程,及每两个状态过渡的细节,请关注后续文章!

MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析的更多相关文章

  1. MapReduce源码分析之新API作业提交(二):连接集群

    MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster,代码如下: private synchronized void co ...

  2. MapReduce源码分析之JobSubmitter(一)

    JobSubmitter,顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外,对外提供的唯一一个非private成员变量或方法就是submitJobInter ...

  3. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  4. 源码分析——从AIDL的使用开始理解Binder进程间通信的流程

    源码分析——从AIDL的使用开始理解Binder进程间通信的流程 Binder通信是Android系统架构的基础.本文尝试从AIDL的使用开始理解系统的Binder通信. 0x00 一个AIDL的例子 ...

  5. spring IoC源码分析 (3)Resource解析

    引自 spring IoC源码分析 (3)Resource解析 定义好了Resource之后,看到XmlFactoryBean的构造函数 public XmlBeanFactory(Resource  ...

  6. Memcached源码分析之请求处理(状态机)

    作者:Calix 一)上文 在上一篇线程模型的分析中,我们知道,worker线程和主线程都调用了同一个函数,conn_new进行事件监听,并返回conn结构体对象.最终有事件到达时,调用同一个函数ev ...

  7. MapReduce源码分析之LocatedFileStatusFetcher

    LocatedFileStatusFetcher是MapReduce中一个针对给定输入路径数组,使用配置的线程数目来获取数据块位置的实用类.它的主要作用就是利用多线程技术,每个线程对应一个任务,每个任 ...

  8. ThreadPoolExecutor源码分析-面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?

    Java版本:8u261. 对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路.但是假如我是面试官,现在我想问一些更细致的问题, ...

  9. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore

    @SessionAttribute作用于处理器类上,用于在多个请求之间传递参数,类似于Session的Attribute,但不完全一样,一般来说@SessionAttribute设置的参数只用于暂时的 ...

随机推荐

  1. 十. 图形界面(GUI)设计8.选择框和单选按钮

    选择框.单选框和单选按钮都是选择组件,选择组件有两种状态,一种是选中(on),另一种是未选中(off),它们提供一种简单的 “on/off”选择功能,让用户在一组选择项目中作选择. 选择框 选择框(J ...

  2. 十. 图形界面(GUI)设计5.布局设计

    在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计.java.awt中定义了多种布局类,每种布局类对应一种布局的策略.常用的有以下布局类: FlowLayout, ...

  3. Java高级架构师(一)第16节:Mybatis动态查询和Json自动拼装

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  4. 网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  5. 【docker】查看docker镜像的版本号TAG,从远程仓库拉取自己想要版本的镜像

    要想查看镜像的版本好TAG,需要在docker hub查看 地址如下:https://hub.docker.com/r/library/ 进入之后,在页面左上角搜索框搜索, 例如搜索redis 搜索完 ...

  6. Node.js 连接mySQL程序

    环境:Oracle Enterprise Linux R5U7 安装mySQL 关于离线安装,下次在尝试,目前先来在线安装,过程如下: $ rpm -qa | grep -i mysql $ wget ...

  7. hbase集群安装和shell操作

    1.上传hbase安装包 2.解压 3.配置hbase集群,要修改3个文件(首先zk集群已经安装好了) 注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/ ...

  8. Bitnami 2015

    WordPress WordPress is one of the world's most popular web publishing platforms for building blogs a ...

  9. &lt;LeetCode OJ&gt; 328. Odd Even Linked List

    328. Odd Even Linked List Total Accepted: 9271 Total Submissions: 24497 Difficulty: Easy Given a sin ...

  10. 开启GodMode

    上帝模式的开启方法:首先你可以在任何地方创建一个新文件夹,这个操作对于几乎所有电脑用户来说都非常简单,然后重要的是,将这个新文件夹重命名为 “GodMode.{ED7BA470-8E54-465E-8 ...