首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 云计算 >

MapReduce调度与实施原理之作业初始化

2013-09-26 
MapReduce调度与执行原理之作业初始化前言:本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后

MapReduce调度与执行原理之作业初始化

前言:本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教。本文不涉及Hadoop的架构设计,如有兴趣请参考相关书籍和文献。在梳理过程中,我对一些感兴趣的源码也会逐行研究学习,以期强化基础。
作者:Jaytalent
开始日期:2013年9月9日参考资料:【1】《Hadoop技术内幕--深入解析MapReduce架构设计与实现原理》董西成                  【2】Hadoop 1.0.0 源码
                            【3】《Hadoop技术内幕--深入解析Hadoop Common和HDFS架构设计与实现原理》蔡斌 陈湘萍在上一篇文章中,作业准备提交到JobTracker了。本文关注作业在提交到JobTracker后且在执行前经历了哪些事情。一个MapReduce作业的生命周期大体分为5个阶段【1】:1. 作业提交与初始化2. 任务调度与监控3. 任务运行环境准备4. 任务执行5. 作业完成一、作业提交与初始化在 JobClient.submitJobInternal方法中,最后一步就是将作业提交到JobTracker:
    // create cleanup two cleanup tips, one map and one reduce.    cleanup = new TaskInProgress[2];    // cleanup map tip. This map doesn't use any splits. Just assign an empty    // split.    TaskSplitMetaInfo emptySplit = JobSplit.EMPTY_TASK_SPLIT;    cleanup[0] = new TaskInProgress(jobId, jobFile, emptySplit,             jobtracker, conf, this, numMapTasks, 1);    cleanup[0].setJobCleanupTask();    // cleanup reduce tip.    cleanup[1] = new TaskInProgress(jobId, jobFile, numMapTasks,                       numReduceTasks, jobtracker, conf, this, 1);    cleanup[1].setJobCleanupTask();
至此,作业初始化工作完成。接下来,调度器会根据当前可用的slot资源,从队列中选择一个作业,进而选择该作业的一个任务,放到空闲slot上执行。四种任务执行的顺序为Setup、Map、Reduce和Cleanup。由于Reduce任务的输入依赖于Map任务的输出,因此Reduce任务通常延后开始,否则将闲置reduce slot。可以配置档Map任务进度大于mapred.reduce.slowstart.completed.maps时,Reduce任务才开始,该值默认为5%。Map和Reduce任务这种依赖性在任务调度器设计中时常考虑。例如Facebook在提出FairScheduler的论文中就试图解决这个问题。另外,关于为什么JobTracker将初始化工作交给调度器处理,文献【1】给出的理由是:作业初始化后会占用内存资源,如果有大量初始化作业在JobTracker等待调度就会占用不必要的资源。在交给调度器后,Hadoop按照一定策略选择性地初始化以节省内存资源。只有经过初始化的作业才能得到调度,因此将初始化工作嵌入调度器中比较合理。有关任务调度器内容详见下一篇文章:MapReduce调度与执行原理之任务调度



热点排行