MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:         作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程。Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件。        作业Job的全部状态维护在类JobStateInternal中,如下所示:publ...

        作业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处理,详情以后再做分析。


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

相关文章
|
4天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
3月前
|
人工智能 前端开发 Java
【Tomcat源码分析】启动过程深度解析 (二)
本文深入探讨了Tomcat启动Web应用的过程,重点解析了其加载ServletContextListener及Servlet的机制。文章从Bootstrap反射调用Catalina的start方法开始,逐步介绍了StandardServer、StandardService、StandardEngine、StandardHost、StandardContext和StandardWrapper的启动流程。每个组件通过Lifecycle接口协调启动,子容器逐层启动,直至整个服务器完全启动。此外,还详细分析了Pipeline及其Valve组件的作用,展示了Tomcat内部组件间的协作机制。
【Tomcat源码分析】启动过程深度解析 (二)
|
4月前
|
数据可视化 定位技术 API
云解析地图作业问题之通过saveEffect实现组件联动如何解决
云解析地图作业问题之通过saveEffect实现组件联动如何解决
55 14
|
4月前
|
机器学习/深度学习 算法 PyTorch
【模式识别】计算机科学博士课程作业解析
课程作业的解析,涵盖了最小风险贝叶斯决策、最小错误率贝叶斯决策、Python编程实现的机器学习算法,包括KNN、SVM和卷积神经网络在特定数据集上的应用与评估。
41 1
|
4月前
|
JavaScript 前端开发 定位技术
云解析地图作业问题之在搭建页面中简化数据筛选的过程如何解决
云解析地图作业问题之在搭建页面中简化数据筛选的过程如何解决
38 0
|
6月前
|
存储 并行计算 算法
深入解析Java并发库(JUC)中的Phaser:原理、应用与源码分析
深入解析Java并发库(JUC)中的Phaser:原理、应用与源码分析
|
7月前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
7月前
|
Serverless C++ 容器
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
|
6月前
|
分布式计算 Java Hadoop
实现多文件合并和去重的MapReduce作业
实现多文件合并和去重的MapReduce作业
182 0
|
6月前
|
分布式计算 大数据
mapreduce 实现带有ex前缀的词频统计wordcount 大作业
mapreduce 实现带有ex前缀的词频统计wordcount 大作业

热门文章

最新文章

推荐镜像

更多