MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析
作业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状态机解析(一)简介与正常流程浅析相关推荐
- MapReduce 源码分析(一)准备阶段
MapReduce 源码分析 本篇博客根据wordCount代码进行分析底层源码的.以下称它为WC类. package com.henu;import org.apache.hadoop.conf.C ...
- Kafka源码分析10:副本状态机ReplicaStateMachine详解 (图解+秒懂+史上最全)
文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 + 大厂必备 +涨薪 ...
- android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
1.Camera2 preview的应用层流程分析 preview流程都是从startPreview开始的,所以来看startPreview方法的代码: <code class="hl ...
- k8s源码分析 pdf_rook源码分析之一:rook架构解析
rook简介 Rook是一款云原生环境下的开源分布式存储编排系统,目前支持 Ceph.NFS.Edegefs.Cassandra.CockroachDB等存储系统.它实现了一个自动管理的.自动扩容的. ...
- Mybatis-Spring源码分析(五) MapperMethod和MappedStatement解析
前言 基本上这就是Mybatis-Spring源码的最后一篇了,如果想起来什么再单开博客.比起来Spring源码,Mybatis的确实简单一些,本篇就说一下Mybatis中两个十分重要的类Mapper ...
- sharding-JDBC源码分析(二)SQL解析
SQL parser SQL解析是根据语法与词法分析SQL,理解SQL含义,才能按照SQL语义处理数据,SQL解析是实现分库分表组件最基础的功能,熟悉Mysql架构的,内部也有很重要的一个模块就是SQ ...
- MapReduce源码分析_李孟_新浪博客
job.waitForCompletion(true);进入源码 submit()-> connect();连接,客户端获取服务端的代理对象 connect()->new Cluster( ...
- Mapreduce源码分析(一):FileInputFormat切片机制,源码详解
FileInputFormat切片机制,源码详解 1.InputFormat:抽象类 只有两个抽象方法 public abstract List<InputSplit> getSplits ...
- x264源码分析与应用示例(一)——视频编码基本流程
本文包含以下内容 1.H.264编码流程详述与对应x264源码解析 首先简单介绍一下x264源码调试与修改的基本方法.就是基本的conifigure和make,configure命令使用最简单的就可以 ...
最新文章
- 最高65万美元!2021美大厂码农收入一览
- Redis 实践笔记
- 编译程序基本原理的知识笔记
- 【翻译】.NET 5 RC1发布
- 宁波Uber优步司机奖励政策(12月14日到12月20日)
- python提示对话框自动关闭_Python实现定时自动关闭的tkinter窗口方法
- python安装后无法打开文本_Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory...
- 163editor 网页编辑器 获值
- ovs vlan tag管理
- Android 项目必备(二十三)-->减小 APK 大小
- 51单片机~蜂鸣器,数码管的使用
- lzg_ad:XPE镜像文件部署详解
- Python贪吃蛇双人大战-升级版
- wifi6连接不上个别wifi
- 监控平台(J2EE)声音告警程序功能设计与实现
- Android音乐播放器制作(一)扫描本地音乐显示在手机上
- 《牧羊少年奇幻之旅》的优秀读后感分享3300字
- outlook 禁用不安全_在Outlook 2007中禁用即时搜索
- ZUCC_操作系统原理实验_Lab9进程的通信消息队列
- Scratch软件编程等级考试一级——20191221
热门文章
- oracle惯用缩写的含义
- php excel类 ,phpExcel使用方法介绍
- Linux查看系统信息的一些命令及查看已安装软件包的命令(转)
- 自助收银导致货损增加,阿里安全如何用视频识别AI应对?
- Git忽略已经被提交的文件
- JVM结构、GC工作机制详解
- template might not exist or might not be accessible by any of the configured Template Resolvers
- 多个互相有联系的checkbox的单选逻辑
- dede首页调用栏目内容{dedefield.content}的方法
- 在JavaScript中使用inline函数的问题