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

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

public enum JobStateInternal {// 作业新建状态,当作业Job被新创建时所处的状态NEW,// 作业启动状态,此时运行时间已被设置,任务处于开始被调度阶段SETUP,// 作业已初始化状态,此时作业中的Map、Reduce任务均已被创建INITED,// 作业正在运行状态,此时作业会为Map、Reduce任务申请资源并进行资源分配,任务被启动,直至全部任务运行完成RUNNING,// 作业等待提交最终结果的状态,此时作业运行过程中产生的中间结果已被放置到临时目录中,当全部任务运行完成后,进行最终结果提交,即将临时目录数据提交到最终目录COMMITTING,// 作业运行成功状态,此时作业的运行结果被成功提交至最终目录,作业运行成功SUCCEEDED,// 等待正在运行的任务被杀死的状态FAIL_WAIT,// 作业运行失败将被注销时的状态FAIL_ABORT,// 作业运行失败所处的状态FAILED,// 作业等待被杀死时所处的状态KILL_WAIT,// 作业被注销时所处的状态KILL_ABORT,// 作业被杀死后所处的状态KILLED,// 作业运行过程中出错后所处的状态ERROR,// 作业重启所处状态REBOOT
}

关于作业状态的详细信息,我们稍后再做介绍,这里,需要特别说明的是,前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 源码分析(一)准备阶段

    MapReduce 源码分析 本篇博客根据wordCount代码进行分析底层源码的.以下称它为WC类. package com.henu;import org.apache.hadoop.conf.C ...

  2. Kafka源码分析10:副本状态机ReplicaStateMachine详解 (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 + 大厂必备 +涨薪 ...

  3. android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

    1.Camera2 preview的应用层流程分析 preview流程都是从startPreview开始的,所以来看startPreview方法的代码: <code class="hl ...

  4. k8s源码分析 pdf_rook源码分析之一:rook架构解析

    rook简介 Rook是一款云原生环境下的开源分布式存储编排系统,目前支持 Ceph.NFS.Edegefs.Cassandra.CockroachDB等存储系统.它实现了一个自动管理的.自动扩容的. ...

  5. Mybatis-Spring源码分析(五) MapperMethod和MappedStatement解析

    前言 基本上这就是Mybatis-Spring源码的最后一篇了,如果想起来什么再单开博客.比起来Spring源码,Mybatis的确实简单一些,本篇就说一下Mybatis中两个十分重要的类Mapper ...

  6. sharding-JDBC源码分析(二)SQL解析

    SQL parser SQL解析是根据语法与词法分析SQL,理解SQL含义,才能按照SQL语义处理数据,SQL解析是实现分库分表组件最基础的功能,熟悉Mysql架构的,内部也有很重要的一个模块就是SQ ...

  7. MapReduce源码分析_李孟_新浪博客

    job.waitForCompletion(true);进入源码 submit()-> connect();连接,客户端获取服务端的代理对象 connect()->new Cluster( ...

  8. Mapreduce源码分析(一):FileInputFormat切片机制,源码详解

    FileInputFormat切片机制,源码详解 1.InputFormat:抽象类 只有两个抽象方法 public abstract List<InputSplit> getSplits ...

  9. x264源码分析与应用示例(一)——视频编码基本流程

    本文包含以下内容 1.H.264编码流程详述与对应x264源码解析 首先简单介绍一下x264源码调试与修改的基本方法.就是基本的conifigure和make,configure命令使用最简单的就可以 ...

最新文章

  1. 最高65万美元!2021美大厂码农收入一览
  2. Redis 实践笔记
  3. 编译程序基本原理的知识笔记
  4. 【翻译】.NET 5 RC1发布
  5. 宁波Uber优步司机奖励政策(12月14日到12月20日)
  6. python提示对话框自动关闭_Python实现定时自动关闭的tkinter窗口方法
  7. python安装后无法打开文本_Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory...
  8. 163editor 网页编辑器 获值
  9. ovs vlan tag管理
  10. Android 项目必备(二十三)-->减小 APK 大小
  11. 51单片机~蜂鸣器,数码管的使用
  12. lzg_ad:XPE镜像文件部署详解
  13. Python贪吃蛇双人大战-升级版
  14. wifi6连接不上个别wifi
  15. 监控平台(J2EE)声音告警程序功能设计与实现
  16. Android音乐播放器制作(一)扫描本地音乐显示在手机上
  17. 《牧羊少年奇幻之旅》的优秀读后感分享3300字
  18. outlook 禁用不安全_在Outlook 2007中禁用即时搜索
  19. ZUCC_操作系统原理实验_Lab9进程的通信消息队列
  20. Scratch软件编程等级考试一级——20191221

热门文章

  1. oracle惯用缩写的含义
  2. php excel类 ,phpExcel使用方法介绍
  3. Linux查看系统信息的一些命令及查看已安装软件包的命令(转)
  4. 自助收银导致货损增加,阿里安全如何用视频识别AI应对?
  5. Git忽略已经被提交的文件
  6. JVM结构、GC工作机制详解
  7. template might not exist or might not be accessible by any of the configured Template Resolvers
  8. 多个互相有联系的checkbox的单选逻辑
  9. dede首页调用栏目内容{dedefield.content}的方法
  10. 在JavaScript中使用inline函数的问题