当前位置:   article > 正文

MapReduce调度与执行原理之任务调度(续)_mapreduce计算资源调度

mapreduce计算资源调度
前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教。本文不涉及Hadoop的架构设计,如有兴趣请参考相关书籍和文献。在梳 理过程中,我对一些感兴趣的源码也会逐行研究学习,以期强化基础。
作者 :Jaytalent
开始日期 :2013年9月9日
参考资料:【1】《Hadoop技术内幕--深入解析MapReduce架构设计与实现原理》董西成
                  【2】   Hadoop 1.0.0 源码
                            【3】《Hadoop技术内幕--深入解析Hadoop Common和HDFS架构设计与实现原理》蔡斌 陈湘萍
继续 上一篇文章的话题,说说调度器的任务选择机制。
一个MapReduce作业的生命周期大体分为5个阶段 【1】
1. 作业提交与初始化
2.  任务调度与监控
3. 任务运行环境准备
4. 任务执行
5. 作业完成
当JobTracker收到了来自TaskTracker的心跳后,是如何选择任务的呢?是通过assignTasks方法。下面详细分析该方法。在分析之前,首先提一下Hadoop的调度器调度模型。通常情况下,Hadoop会以队列为单位管理作业和资源。有了队列就产生所谓三级调度模型:调度器依次选择一个队列,队列中的一个作业,作业中的一个任务,最终将任务分配给有空闲slot的TaskTracker。assignTasks的实现也遵循这个模型:
    Collection<JobInProgress> jobQueue = jobQueueJobInProgressListener.getJobQueue();
对于FIFO调度器而言,队列即为对应监听器中使用的作业队列。然后,声明一个列表,用于保存选择的任务:
  1. // Assigned tasks
  2. List<Task> assignedTasks = new ArrayList<Task>();
接下来,计算队列中正在运行的和等待运行的map和reduce任务的数量:
  1. // Compute (running + pending) map and reduce task numbers across pool
  2. int remainingReduceLoad = 0;
  3. int remainingMapLoad = 0;
  4. synchronized (jobQueue) {
  5. for (JobInProgress job : jobQueue) {
  6. if (job.getStatus().getRunState() == JobStatus.RUNNING) {
  7. remainingMapLoad += (job.desiredMaps() - job.finishedMaps());
  8. if (job.scheduleReduces()) {
  9. remainingReduceLoad +=
  10. (job.desiredReduces() - job.finishedReduces());
  11. }
  12. }
  13. }
  14. }
其中,job.scheduleReduces方法判断当前map任务的总体进度是否满足reduce任务开始调度的条件,map任务完成的比例是否超过变量mapred.reduce.slowstart.completed.maps的值,若超过则计算reduce任务的剩余任务数。接下来,计算map和reduce任务的负载因子:
  1. // Compute the 'load factor' for maps and reduces
  2. double m
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号