MapReduce调度与执行原理之作业初始化
前言:本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教。本文不涉及Hadoop的架构设计,如有兴趣请参考相关书籍和文献。在梳理过程中,我对一些感兴趣的源码也会逐行研究学习,以期强化基础。【3】《Hadoop技术内幕--深入解析Hadoop Common和HDFS架构设计与实现原理》蔡斌 陈湘萍在上一篇文章中,作业准备提交到JobTracker了。本文关注作业在提交到JobTracker后且在执行前经历了哪些事情。一个MapReduce作业的生命周期大体分为5个阶段【1】:1. 作业提交与初始化2. 任务调度与监控3. 任务运行环境准备4. 任务执行5. 作业完成一、作业提交与初始化在 JobClient.submitJobInternal方法中,最后一步就是将作业提交到JobTracker:
作者:Jaytalent
开始日期:2013年9月9日参考资料:【1】《Hadoop技术内幕--深入解析MapReduce架构设计与实现原理》董西成 【2】Hadoop 1.0.0 源码
// 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调度与执行原理之任务调度