Hadoop源代码分析(类Task)

来源:互联网 发布:凡科网站源码下载 编辑:程序博客网 时间:2024/05/30 02:24

有了前面的基础,我们可以来分析类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等,我们就不再介绍了。

下面我们开始来分析Task的成员函数,首先是虚方法,Task包含了下面3个虚方法:

    public abstract void run(JobConf job, TaskUmbilicalProtocol umbilical)

        throws IOException, ClassNotFoundException, InterruptedException;

执行Task;

    public abstract TaskRunner createRunner(TaskTracker tracker,

           TaskTracker.TaskInProgress tip) throws IOException;

创建一个TaskRunner;

    public abstract boolean isMapTask();

是否是一个Map任务。上面这3个方法自然是和MapTask,ReduceTask相关,也需要它们实现。

构造函数很简单,主要是初始化一些成员函数。initialize也用于初始化成员,它被Task的子类调用,用于子类传入一些子类中构造的对象。构造函数后面是一系列的setter和getter,还有实现Writable的write和readFields。

localizeConfiguration函数用于将一些和Task相关的信息存放到JobConf里,这也是Hadoop MapReduce中重要的参数传递方式。

接下来分析的是一系列和Task生命周期相关的函数。

    public void done(TaskUmbilicalProtocol umbilical, TaskReporter reporter )

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的具体实现。


原创粉丝点击