`
superlxw1234
  • 浏览: 552307 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44544
社区版块
存档分类
最新评论

【转】Jobtracker重启Job recovery过程分析

阅读更多

Jobtracker重启Job recovery过程分析

1.  Job Recovery的有关配置项

配置项

默认值

含义

mapred.jobtracker.restart.recover

false

true时JT重启之前运行的job可以在jobtracker restart之后恢复,false则需要重新运行。

mapred.jobtracker.job.history.block.size

3145728

保存Job历史日志文件的大小,job的恢复就是使用这些历史日志。

hadoop.job.history.location

${hadoop.log.dir}/history

Job history存储位置

2.   Job 如何恢复运行

1)   日志文件:jobtracker restart之后恢复一个正在运行的job,首先通过解析job日志文件,通过job日志文件恢复job的一些task的运行状况。

2)   JT restart之后TT再次连接上JT时向JT汇报他们运行task的情况。

3)    JT重启之后,对1)和2)中没有恢复的task和还没运行的task重新调度运行。

3.   Job Recovery 相关类

Job Recover过程主要通过JobTracker.RecoveryManager类进行管理,job日志的记录和解析主要有JobHistory类完成。

4.   Job Recover的详细过程

1)   JobTracker restart之后首先检查是否有需要恢复的job,通过RecoveryManager. checkAndAddJob()实现。

2)    如果有要恢复的job,在offerService()中启动RecoverManager.recover()开始恢复job:

(1)  初始化jobs,根据"mapred.system.dir"目录文件信息缓存需要恢复job的JobID以及该job history日志文件路径。

(2)在日志文件中恢复job:根据job恢复日志的路径得到恢复日志,首先通过 JobHistory.parseHistoryFromFS(String path, Listener l, FileSystem fs)解析job日志文件,提取日志文件的每一行信息(path是指日志文件的路径,Listener是一个监听器),然后通过 JobRecoveryListener.handle()来处理每行日志信息恢复job运行状况。

3)   所有job日志文件解析恢复完成之后,TaskTracker重新连接 上JT的时候,TT会向JT汇报他们上面运行的task状况,实现过程如下(在 JobTracker.updateTaskStatuses(TaskTrackerStatus status)中):

if (tip != null || hasRestarted()) {
          if (tip == null) {
          tip = job.getTaskInProgress(taskId.getTaskID());
          job.addRunningTaskToTIP(tip, taskId, status, false);
          }        

 }

5.  总结:虽然hadoop提供了Jobtracker restart之后job recover过程,最近在做JobTracker HA,发现但该过程还存在着很多问题

1)   Job日志有缓存,刷入日志文件不急时,这个可能导致的问题:

(1)  jobtracker restart 之后job恢复运行的时候会出现task失去连接:
2012-02-16 17:11:49,224 INFO org.apache.hadoop.mapred.JobTracker: attempt_201202161703_0002_m_000039_0 is 200024 ms debug.
attempt_201202161703_0002_m_000039_0 is 400036 ms debug.
attempt_201202161703_0002_m_000039_0 is 600047 ms debug.
Launching task attempt_201202161703_0002_m_000039_0 timed out.
这样需要等9分钟之后确定该task timeout之后才会重新再运行该task
原 因:由于日志刷入日志文件不够及时,日志文件中记录有一个task的attempt task启动时的信息,而没记录他运行结束时的信息(其实已经运行成功),job恢复的时候,Jt误认为该task还在运行,然后一直等TT向它汇报该 task的信息,直到该task timeout。(实际该task在JT重启前已经完成了,所有JT重启之后,TT不会再汇报该task的状态)

(2)一个小job,所有task都在运行,job日志还没刷入日志文件,这时重启JT的时候,job 再运行的时候出现cleanup job在setup job完成之前完成,导致JT一直认为这个job还在运行中。

(3)JT restart之后重新运行job出现job的reduce task比map task先完成的情况

2)   JT restart之后TT再次连接上JT之后,TT向JT汇报状态时,JT处理时没有考虑cleanup task(killed/failed  uncleanup task)状态的task

if (tip != null || hasRestarted()) {
          if (tip == null) {
          tip = job.getTaskInProgress(taskId.getTaskID());
          job.addRunningTaskToTIP(tip, taskId, status, false);
          }        

 }

如上,JT会把所有的task做相同的处 理:job.addRunningTaskToTIP(tip, taskId, status, false),此时若果task是cleanup task(killed/failed  uncleanup task)这种task时,JT会把它当作普通的task运行,由于cleanup task(killed/failed  uncleanup task)和之前运行该task时采用相同的attempt ID,最后导致JT调度的时候会出现一个task有两个相同的attempt ID,该task会一直处于holding状态(和HADOOP-5394不同)。

3)   解决方案:

(1)为了解决日志刷新不及时问题可以对log4j新增一个appender支持周期性地刷新log到磁盘。

(2) 为了解决上面2)的问题,可以在if (tip != null || hasRestarted())处加上当task处于cleanup task(killed/failed  uncleanup task)状态时的处理方法。

 

原文链接:http://www.cnblogs.com/MGGOON/archive/2012/02/23/2365055.html

分享到:
评论

相关推荐

    MapReduceV1:Job提交流程之JobTracker端分析

    上一篇我们分析了Job提交过程中JobClient端的处理流程(详见文章MapReduceV1:Job提交流程之JobClient端分析),这里我们继续详细分析Job提交在JobTracker端的具体流程。通过阅读源码可以发现,这部分的处理逻辑还是...

    MapReduce Job本地提交过程源码跟踪及分析

    MapReduce是Hadoop生态系统中的核心组件,主要用于处理和存储大规模数据。...通过阅读《Job本地提交过程源码分析及图解》这样的文档,我们可以深入学习MapReduce的工作原理,提升我们的Hadoop编程技能。

    MapReduceV1:JobTracker端Job/Task数据结构

    在MapReduce程序运行的过程中,JobTracker端会在内存中维护一些与Job/Task运行相关的信息,了解这些内容对分析MapReduce程序执行流程的源码会非常有帮助。在编写MapReduce程序时,我们是以Job为单位进行编程处理,一...

    MapReduce Job集群提交过程源码跟踪及分析

    下面我们将深入源码,详细分析这一过程。 首先,当用户编写好MapReduce程序并调用Job的submit()方法时,客户端会进行一系列的初始化工作。这包括将程序的JAR包、配置信息以及输入输出路径等打包成一个JobConf对象,...

    MapReduceV1:JobTracker处理Heartbeat流程分析

    我们基于Hadoop1.2.1源码分析MapReduceV1的处理流程。这篇文章的内容,更多地主要是描述处理/交互流程性的东西,大部分流程图都是经过我梳理后画出来的(开始我打算使用序列图来描述流程,但是发现很多流程在单个...

    JobTracker:Hadoop JobTracker OS X 菜单栏应用程序

    JobTracker Mac 菜单栏应用程序 Hadoop JobTracker 的 Mac 菜单栏应用程序界面。 它使您可以轻松访问 JobTracker 中的作业,并提供有关开始、完成和失败作业的 Growl/通知中心通知。 请参阅了解更多信息并下载二...

    MapReduceV1:Job提交流程之JobClient端分析

    我们基于Hadoop1.2.1源码分析MapReduceV1的处理流程。MapReduceV1实现中,主要存在3个主要的...在编写好MapReduce程序以后,需要将Job提交给JobTracker,那么我们就需要了解在提交Job的过程中,在JobClient端都做了哪

    基于Dijkstra算法分布式JobTracker节点模型通信方式的优化.pdf

    这种通信优化方案的提出,不仅能够提高系统的可靠性,缓解单个JobTracker节点失效时造成的作业失败问题,而且还能减轻单个JobTracker节点的瓶颈,实现负载均衡。在实际的实验结果中,已经证明了基于Dijkstra算法的...

    hadoop源码分析

    在这个过程中,JobClient会将job.jar、job.split和job.xml这三个文件上传到HDFS。job.xml文件包含了作业的配置信息,如Mapper、Combiner、Reducer类型及输入输出格式等。job.jar文件包含了作业执行所需的各类类,如...

    Hadoop学习总结之四:Map-Reduce过程解析

    这一过程主要由`JobClient`类中的`runJob(JobConf job)`静态方法完成。 ##### 1.1 提交任务的具体步骤 - **创建JobClient对象**:通过传入`JobConf`配置对象,构造`JobClient`实例。`JobClient`用于与JobTracker...

    Hadoop-mapreduce过程.doc

    《深入理解Hadoop MapReduce执行过程》 MapReduce是Apache Hadoop的核心组件之一,它为大规模数据处理提供了分布式计算框架。本文将从客户端、JobTracker、TaskTracker和Child四个角度,详细阐述MapReduce的工作...

    我的面试题

    `JobTracker` 返回一个具有特定格式的 Job ID(例如 `job_201101281410_0001`),其中包含了 `JobTracker` 的标识符以及作业的唯一序号。 3. **数据源切片**:`JobClient` 对输入数据源进行切片处理,每个切片...

    hadoop源码分析-mapreduce部分.doc

    首先,用户通过`hadoop jar`命令提交一个Job,例如经典的WordCount程序,JobTracker负责协调整个过程。Job被分解为多个Map任务(M1、M2、M3)和Reduce任务(R1、R2),这些任务由TaskTracker监控并在独立的Java...

    Hadoop多Job并行处理的实例详解

    用户可以通过访问JobTracker的Web界面(默认端口50030)来监控Job的并行状态。 这个实例展示了如何在Hadoop中实现多Job并行处理,通过合理配置和编程,可以大大提高数据处理的效率。需要注意的是,Job之间的依赖...

    0324大数据代码与数据_JAVA大数据_文本分析_运用MapReduce做数据分析_

    Hadoop MapReduce通过JobTracker和TaskTracker组件来管理和监控作业的执行状态,保证作业的顺利完成。 最后,这个项目可能还包括了结果的可视化或进一步分析,例如使用HBase这样的NoSQL数据库存储结果,或者使用...

    妳那伊抹微笑_云计算之Hadoop完美笔记2.0

    JobTracker源码分析 TaskTracker源码分析 网站日志分析项目(这个项目分析可以让你更加掌握好所学的知识) 花了一个星期整理的,希望可以帮到你们、、、 The you smile until forever、、、、、、、、、、、、、...

Global site tag (gtag.js) - Google Analytics