加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSS
您当前的位置:首页 > 教程文章 > NOSQL数据库

Hadoop源代码分析(类Task)

时间:2012-04-27 01:03:09  来源:  作者:

 

有了前面的基础,我们可以来分析类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个虚方法:
publicabstractvoid run(JobConf job, TaskUmbilicalProtocol umbilical)
throws IOException, ClassNotFoundException, InterruptedException;
执行Task;
publicabstract TaskRunner createRunner(TaskTracker tracker,
TaskTracker.TaskInProgress tip) throws IOException;
创建一个TaskRunner;
publicabstractboolean isMapTask();
是否是一个Map任务。上面这3个方法自然是和MapTask,ReduceTask相关,也需要它们实现。
构造函数很简单,主要是初始化一些成员函数。initialize也用于初始化成员,它被Task的子类调用,用于子类传入一些子类中构造的对象。构造函数后面是一系列的setter和getter,还有实现Writable的write和readFields。
localizeConfiguration函数用于将一些和Task相关的信息存放到JobConf里,这也是Hadoop MapReduce中重要的参数传递方式。
接下来分析的是一系列和Task生命周期相关的函数。
publicvoid 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的具体实现。
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
在CentOS下搭建Android 开发环境
在CentOS下搭建Androi
轻松搭建属于自己的Ubuntu发行版
轻松搭建属于自己的Ub
利用SUSE Studio 打造自己的个性化Linux发行版
利用SUSE Studio 打造
那些采用PHP技术的IT大企业
那些采用PHP技术的IT大
相关文章
    无相关信息
栏目更新
栏目热门