专家剖析 Hadoop源代码中的Task类用法

开发 架构 Hadoop
Hadoop源代码相信大家应该有所了解,这里就向大家介绍一下Hadoop源代码中的类Task,欢迎大家一起来学习,相信通过本文的介绍大家对Hadoop源代码中的类有一定的了解。

本节和大家一起学习一下Hadoop源代码中的Task类,Task是一个虚基类,它有两个子类:MapTask,ReduceTask,分别对应着Map和Reduce。下面就来看一下本节的具体介绍吧。

Hadoop源代码中的类Task

Task是一个虚基类,它有两个子类:MapTask,ReduceTask,分别对应着Map和Reduce。先从成员变量开始:

首先是和作业任务相关的信息,包括jobFile,作业的配置文件;taskId,任务ID,从中可以获取作业ID;partition,Job内ID;taskStatus,任务状态。jobCleanup,jobSetup和taskCleanup是三个标志位。

接下来是一组和错误回复的变量。我们知道,如果在Task执行过程中出错,很有可能是因为输入有问题,一个常用的策略是在下一次回复性执行过程中,忽略这部分输入,skipRanges,skipping和writeSkipRecs就是用来控制这个行为的。
currentRecStartIndex和currentRecIndexIterator配合,可以得到当前的任务输入。
conf保存了当前任务的配置(JobConf形式),MapOutputFile上一部分已经介绍了,用于管理临时文件,跟它配合的是lDirAlloc,类型为LocalDirAllocator,是本地文件分配器。jobContext和taskContext保持了Job和Task的上下文。committer定制了和Task生命周期相关的一些特殊处理(也可以看出是上下文)。

最后一部分应该是输出outputFormat。
和统计/状态监视的成员变量分散在类的各处,如spilledRecordsCounter,taskProgress,counters等,我们就不再介绍了。


下面我们开始来进行分析一下Hadoop源代码中类Task的成员函数,首先是虚方法,Task包含了下面3个虚方法:
publicabstractvoidrun(JobConfjob,TaskUmbilicalProtocolumbilical)
throwsIOException,ClassNotFoundException,InterruptedException;

执行Task;
publicabstractTaskRunnercreateRunner(TaskTrackertracker,TaskTracker.TaskInProgresstip)throwsIOException;

创建一个TaskRunner;
publicabstractbooleanisMapTask();
是否是一个Map任务。上面这3个方法自然是和MapTask,ReduceTask相关,也需要它们实现。
Hadoop源代码中的构造函数很简单,主要是初始化一些成员函数。initialize也用于初始化成员,它被Task的子类调用,用于子类传入一些子类中构造的对象。构造函数后面是一系列的setter和getter,还有实现Writable的write和readFields。
localizeConfiguration函数用于将一些和Task相关的信息存放到JobConf里,这也是HadoopMapReduce中重要的参数传递方式。
接下来分析的是一系列和Task生命周期相关的函数。


publicvoiddone(TaskUmbilicalProtocolumbilical,TaskReporterreporter)
done被多个方法调用(下图),用于做结束任务的一些清理工作,步骤如下:
l更新计数器updateCounters();
l如果任务需要提交,设置Taks状态为COMMIT_PENDING,并利用TaskUmbilicalProtocol,汇报Task完成,等待提交;然后调用commit提交任务(下面分析)
l设置任务结束标志位;结束Reporter通信线程;
l发送最后一次统计报告(通过sendLastUpdate方法,很简单);
l利用TaskUmbilicalProtocol报告结束状态(通过sendDone方法,很简单)。


commit方法被done方法调用,用于等待TaskTracker的可提交信号。通过这种机制,Task可以等待TaskTracker上需要的一些后续处理,比方说,把Task的结果取走,需要TaskTracker的协调和确认。commit还会调用org.apache.hadoop.mapreduce.OutputCommitter的commitTask方法,执行一些子类需要的commit事件处理。
runJobCleanupTask,runJobSetupTask和runTaskCleanupTask应用在Maptask和ReduceTask的run方法中,用于做一些准备和可能的清除任务。
runJobSetupTask:为建立Job做准备,执行状态设置,然后调用org.apache.hadoop.mapreduce.OutputCommitter的setupJob,最后通过done,通知TaskTracker任务完成。
runJobCleanupTask:清理Job,包括步骤状态设置,更新状态到TaskTracker,调用org.apache.hadoop.mapreduce.OutputCommitter的相关方法,通过done,通知TaskTracker任务完成。
runTaskCleanupTask:清理Task任务,和runJobCleanupTask类似。
应该说,这些方法只是提供了一个通用的框架,具体需要的执行,在于org.apache.hadoop.mapreduce.OutputCommitter的具体实现。本节关于Hadoop源代码中的类Task相关内容介绍完毕。

【编辑推荐】

  1. 学习笔记 Hadoop集群如何搭建
  2. Hadoop0.20.2集群配置入门指导手册
  3. Hadoop文件系统如何快速安装?
  4. Hadoop集群搭建过程中相关环境配置详解
  5. Hadoop完全分布模式安装实现详解

 

责任编辑:佚名 来源: javaeye.com
相关推荐

2010-06-07 11:12:52

Hadoop-0.20

2010-03-12 14:28:45

Python if语句

2010-03-16 14:48:02

云计算

2009-06-12 19:03:41

Hadoop源代码Yahoo

2010-02-05 18:00:18

Android源代码

2010-06-03 18:32:51

Hadoop

2011-08-01 16:42:24

ibmdwNFS文件系统

2010-02-26 10:24:43

Python源代码

2010-06-02 10:26:06

SVN源代码管理

2023-07-13 09:28:29

设计模式.NET

2010-09-17 09:28:19

Java API

2015-03-24 15:08:21

mapreducehadoop

2010-01-11 16:59:50

C++源代码

2010-06-03 10:22:17

Hadoop入门

2010-06-03 13:08:51

2010-09-02 15:54:54

CSS边界叠加

2010-02-04 13:45:36

C++类模板

2010-08-16 13:03:37

IP路由选择

2009-02-25 14:08:45

绿色IT虚拟环境虚拟化

2022-07-26 11:46:14

黑客论坛Rust编码恶意软件
点赞
收藏

51CTO技术栈公众号