【Mapred】 JobTracker 内部类RecoveryManager简介(上)

2024-04-21 08:38

本文主要是介绍【Mapred】 JobTracker 内部类RecoveryManager简介(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hadoop1.0.3版本
一直知道jobtracker有任务恢复、作业重跑功能等,那么jobtracker是如何实现的呢?
今天通过对jobtracker启动过程的跟踪,来一探究竟。
jobtracker有一个内部类叫做RecoveryManager ,同时jobtracker有个私有成员:
RecoveryManager recoveryManager;
在初始化的时候,对其构造:

recoveryManager = new RecoveryManager();

构造方法其实啥也没干,对其成员变量进行初始化,new一个容器用于保存需要重跑的jobId

public RecoveryManager() {jobsToRecover = new TreeSet<JobID>();}

到这里似乎还看不到它到底在干啥,接着往下看,初始化程序开始找hdfs上的所谓系统路径

  public String getSystemDir() {Path sysDir = new Path(conf.get("mapred.system.dir", "/tmp/hadoop/mapred/system"));  return fs.makeQualified(sysDir).toString();}

          for (FileStatus status : systemDirData) {try {recoveryManager.checkAndAddJob(status);} catch (Throwable t) {LOG.warn("Failed to add the job " + status.getPath().getName(), t);}}
到这里,RecoveryManager 开始干活了,要对这个路径下的所有目录进行检查,进去看看到底检查啥东西:

    // checks if the job dir has the required filespublic void checkAndAddJob(FileStatus status) throws IOException {String fileName = status.getPath().getName();if (isJobNameValid(fileName)) {recoveryManager.addJobForRecovery(JobID.forName(fileName));shouldRecover = true;}}

这里先要搞清楚集群上mapred.system.dir配置的路径下到底存了些什么玩意儿:

drwx------   - hadoop         supergroup          0 2013-12-24 01:09 /jobtracker/system/job_201305281414_821530
drwx------   - hadoop         supergroup          0 2013-12-24 01:12 /jobtracker/system/job_201305281414_821531
drwx------   - hadoop         supergroup          0 2013-12-24 01:12 /jobtracker/system/job_201305281414_821532
drwx------   - hadoop         supergroup          0 2013-12-24 01:12 /jobtracker/system/job_201305281414_821533
drwx------   - hadoop         supergroup          0 2013-12-24 01:12 /jobtracker/system/job_201305281414_821534
drwx------   - hadoop         supergroup          0 2013-12-24 01:12 /jobtracker/system/job_201305281414_821535
-rw-------   3 hadoop         supergroup          4 2013-05-28 14:14 /jobtracker/system/jobtracker.info

看了一眼,除了jobtracker.info,全是以jobid 命名的目录,里边都有个jobToken文件,并且是个二进制文件,至于这是个什么吊东西,回头再说。

    // checks if the job dir has the required filespublic void checkAndAddJob(FileStatus status) throws IOException {String fileName = status.getPath().getName();if (isJobNameValid(fileName)) {//对以作业号命名的目录进行处理recoveryManager.addJobForRecovery(JobID.forName(fileName));//我日,全部加到初始化的容器里了shouldRecover = true;}}
这样,凡是作业号出现在mapred.system.dir中的作业都收集起来,并且等待重跑。

注意这里重跑与否要看配置

<property><name>mapred.jobtracker.restart.recover</name><value>true</value><description>"true" to enable (job) recovery upon restart, "false" to start afresh </description>
</property>

否则,jobtracker会清空那个mapred.system.dir目录。

    if (!hasRestarted) {jobConf.deleteLocalFiles(SUBDIR);}//如果没有需要重跑的作业,那么清空jobtracker本机上的所有计算目录,//1.0.3版本是配置的所有目录下的jobTracker目录SUBDIR="jobTracker"

这样,在jobtracker初始化中,基本上没有RecoveryManager 的事了,转到jobtracker的offerService方法中,一上来就是它,擦:


while (true) {try {recoveryManager.updateRestartCount();break;} catch (IOException ioe) {LOG.warn("Failed to initialize recovery manager. ", ioe);// wait for some timeThread.sleep(FS_ACCESS_RETRY_PERIOD);LOG.warn("Retrying...");}}

updateRestartCount()方法就不讲了,比较啰嗦,就是干了一件事,把要重跑的作业数加1,再写到new Path(getSystemDir(), "jobtracker.info");文件中。

中间弄了个jobtracker.info.recover来回倒换。

从这里可以看出来,一定是那些需要重跑的作业以及总的个数都放到mapred.system.dir里了,至于啥时候放的,再哪放的,后续继续讨论。

下一篇接着讲这些需要重跑的作业到底怎么recover的,打个飞机睡了...


这篇关于【Mapred】 JobTracker 内部类RecoveryManager简介(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922638

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

rust 中的 EBNF简介举例

《rust中的EBNF简介举例》:本文主要介绍rust中的EBNF简介举例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 什么是 EBNF?2. 核心概念3. EBNF 语法符号详解4. 如何阅读 EBNF 规则5. 示例示例 1:简单的电子邮件地址

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下