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
分享到:
相关推荐
上一篇我们分析了Job提交过程中JobClient端的处理流程(详见文章MapReduceV1:Job提交流程之JobClient端分析),这里我们继续详细分析Job提交在JobTracker端的具体流程。通过阅读源码可以发现,这部分的处理逻辑还是...
在MapReduce程序运行的过程中,JobTracker端会在内存中维护一些与Job/Task运行相关的信息,了解这些内容对分析MapReduce程序执行流程的源码会非常有帮助。在编写MapReduce程序时,我们是以Job为单位进行编程处理,一...
我们基于Hadoop1.2.1源码分析MapReduceV1的处理流程。这篇文章的内容,更多地主要是描述处理/交互流程性的东西,大部分流程图都是经过我梳理后画出来的(开始我打算使用序列图来描述流程,但是发现很多流程在单个...
JobTracker Mac 菜单栏应用程序 Hadoop JobTracker 的 Mac 菜单栏应用程序界面。 它使您可以轻松访问 JobTracker 中的作业,并提供有关开始、完成和失败作业的 Growl/通知中心通知。 请参阅了解更多信息并下载二...
MapReduceV1实现中,主要存在3个主要的分布式进程(角色):JobClient、JobTracker和TaskTracker,我们主要是以这三个角色的实际处理活动为主线,并结合源码,分析实际处理流程。下图是《Hadoop权威指南》一书给出的...
JobTracker源码分析 TaskTracker源码分析 网站日志分析项目(这个项目分析可以让你更加掌握好所学的知识) 花了一个星期整理的,希望可以帮到你们、、、 The you smile until forever、、、、、、、、、、、、、...
我们基于Hadoop1.2.1源码分析MapReduceV1的处理流程。TaskTracker周期性地向JobTracker发送心跳报告,在RPC调用返回结果后,解析结果得到JobTracker下发的运行Task的指令,即LaunchTaskAction,就会在TaskTracker...
2、JobTracker 是⼀个 master 服务,软件启动之后 JobTracker 接收 Job,负责调度 Job 的每⼀个⼦任务 task运⾏于 TaskTracker 上,并监控它们,如果发现有失败的 task 就重新运⾏它。⼀般情况应该把 JobTracker ...
自述文件该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...
Jobtracker是您的求职伴侣,可帮助您保持求职的顶峰! 记录和跟踪:只需单击一下,即可保存流行网站中的求职申请和网络联系人。 扩大您的网络:从Springboard社区发现网络和推荐机会。 日志和跟踪:使用Springboard...
JobTracker是一款适用于申请科技行业实习和全职工作的大学生的应用程序,可帮助他们组织工作申请。 为什么要使用这个应用程序? 目前,大学生使用 Excel 电子表格、Google Sheets 电子表格或跟踪他们的实习和新毕业...
JobClient 用戶編寫的MapReduce程序通過Client提交到...每一個Job都會在用戶端通過Client類將應用程序以及參數配置Configuration打包成Jar文件存儲在HDFS,並把路徑提交到JobTracker,然後由JobTracker創建每一
#资源达人分享计划#
该工具是非侵入性的,基于分析 jobtracker 中的历史文件夹。工作分析该工具分析并公开有关作业的所有信息。 这范围从映射器/缩减器计数(包括失败计数)、处理持续时间、输入/输出记录计数和字节,到由更高层创建的...
⼤数据下的⽤户⾏为分析 ⼤数据下的⽤户⾏为分析 1. Consumer behaviour is the study of when,why,how and where people do or don't buy a product。 ⽤户⾏为⼀般指⽤户通过中间资源,购买、使⽤和评价某种产品...
1、 通过nutch,诞生了hadoop、tika、gora。 2、 nutch通过ivy来进行依赖管理(1.2之后)。...通过hadoop命令把apache-nutch-1.6.job提交给hadoop的JobTracker。 7、 nutch入门重点在于分析nutch脚本文件
工作追踪器 1.0 在此处部署版本: : 这里的后端存储库: : 一个使用 React、express、node 和 MongoDB 从头构建的 jobtracker 应用程序! 在寻找新的下一个机会的同时跟踪我申请的所有工作!