本节和大家一起学习一下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相关内容介绍完毕。
【编辑推荐】