注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

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

2011-04-07 23:44:26|  分类: Hadoop |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    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相关内容介绍完毕。

  评论这张
 
阅读(762)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016