mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.05,其在接口MRJobConfig中表示如下:

  1. // 当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.05
  2. public static final String COMPLETED_MAPS_FOR_REDUCE_SLOWSTART = "mapreduce.job.reduce.slowstart.completedmaps";

那么这个参数在Yarn中是如何使用的呢?本文我们将解答这个问题。

既然这个参数的含义是当Map Task完成的比例达到该值后才会为Reduce Task申请资源,那么在Yarn中关于资源分配申请服务的RMContainerAllocator中,自然会用到它。在服务初始化的serviceInit()方法中,有如下代码:

  1. // reduceSlowStart取参数mapreduce.job.reduce.slowstart.completedmaps,默认为0.05,
  2. // 其代表当Map Task完成的比例达到该值后才会为Reduce Task申请资源
  3. reduceSlowStart = conf.getFloat(
  4. MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART,
  5. DEFAULT_COMPLETED_MAPS_PERCENT_FOR_REDUCE_SLOWSTART);

这个reduceSlowStart就代表当Map Task完成的比例达到该值后才会为Reduce Task申请资源,它取参数mapreduce.job.reduce.slowstart.completedmaps,参数未配置时默认为0.05。而在进行Reduce任务相关资源申请调度时,会传入这个reduceSlowStart,如下:

  1. scheduleReduces(
  2. getJob().getTotalMaps(), completedMaps,
  3. scheduledRequests.maps.size(), scheduledRequests.reduces.size(),
  4. assignedRequests.maps.size(), assignedRequests.reduces.size(),
  5. mapResourceRequest, reduceResourceRequest,
  6. pendingReduces.size(),
  7. maxReduceRampupLimit, reduceSlowStart);

scheduleReduces()方法是专门处理Reduce任务相关资源申请调度的,其中对于reduceSlowStart是按照以下方式进行处理的,如下:

  1. //check for slow start
  2. // 在Reduce调度尚未启动时,即标志位reduceStarted为false时
  3. if (!getIsReduceStarted()) {//not set yet
  4. // 计算Reduce Task启动时最低要求完成的Map Task数目completedMapsForReduceSlowstar,
  5. // 计算公式为reduceSlowStart * totalMaps,向上取整,totalMaps表示Map Task总数目
  6. int completedMapsForReduceSlowstart = (int)Math.ceil(reduceSlowStart *
  7. totalMaps);
  8. // 如果已完成Map Task数目completedMaps小于上述要求完成的Map Task数目completedMapsForReduceSlowstart,
  9. // 记录info级别日志信息:Reduce slow start threshold not met.completedMapsForReduceSlowstart ?
  10. // 即Reduce任务最低启动门槛没有满足,并输出最低启动门槛,即要求已完成的Map Task数目:completedMapsForReduceSlowstart数目,然后返回,不进行资源申请调度
  11. if(completedMaps < completedMapsForReduceSlowstart) {
  12. LOG.info("Reduce slow start threshold not met. " +
  13. "completedMapsForReduceSlowstart " +
  14. completedMapsForReduceSlowstart);
  15. return;
  16. } else {
  17. // 如果达到了最低启动门槛,同样记录info级别日志信息:Reduce slow start threshold reached. Scheduling reduces.
  18. // 即Reduce最低启动门槛已达到,开始调度Reduce
  19. LOG.info("Reduce slow start threshold reached. Scheduling reduces.");
  20. // 并设置标志位reduceStarted为true,即该Reduce资源申请已被调度
  21. setIsReduceStarted(true);
  22. }
  23. }

我们看到,在Reduce调度尚未启动时,即标志位reduceStarted为false时:

1、首先计算Reduce Task启动时最低要求完成的Map Task数目completedMapsForReduceSlowstar,计算公式为reduceSlowStart * totalMaps,向上取整,totalMaps表示Map Task总数目;

2、如果已完成Map Task数目completedMaps小于上述要求完成的Map Task数目completedMapsForReduceSlowstart,记录info级别日志信息:Reduce slow start threshold not met.completedMapsForReduceSlowstart * ,即表示Reduce任务最低启动门槛没有满足,并输出最低启动门槛,即要求已完成的Map Task数目:completedMapsForReduceSlowstart数目,然后返回,不进行资源申请调度;

3、如果达到了最低启动门槛,同样记录info级别日志信息:Reduce slow start threshold reached. Scheduling reduces.即Reduce最低启动门槛已达到,开始调度Reduce,并设置标志位reduceStarted为true,即该Reduce资源申请已被调度。

需要特别注意的是,在JobImpl中,如果处于Uber模式下,会将mapreduce.job.reduce.slowstart.completedmaps参数设置为1,这很好理解,因为不管Map Task,还是Reduce Task,均是串行执行的,所以当Map Task完成的比例达到多少值后才会为Reduce Task申请资源,这个值百分百应该是1。处理该参数相关代码如下:

  1. if (isUber) {
  2. LOG.info("Uberizing job " + jobId + ": " + numMapTasks + "m+"
  3. + numReduceTasks + "r tasks (" + dataInputLength
  4. + " input bytes) will run sequentially on single node.");
  5. // make sure reduces are scheduled only after all map are completed
  6. conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART,
  7. 1.0f);
  8. //......省略后续相关代码

Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍的更多相关文章

  1. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)

    本文继<Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)>,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作 ...

  2. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)

    我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMas ...

  3. Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?

    在MRAppMaster中,当MapReduce作业初始化时,它会通过作业状态机JobImpl中InitTransition的transition()方法,进行MapReduce作业初始化相关操作,而 ...

  4. springMVC源码分析--RequestParamMethodArgumentResolver参数解析器(三)

    之前两篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)和springMVC源码解析--HandlerMethodArgumentResol ...

  5. springMVC源码分析--HttpMessageConverter参数read操作(二)

    上一篇博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们简单介绍了一下HttpMessageConverter接口提供的几个方法,主要有以下几个方法: (1 ...

  6. Yarn源码分析之MRAppMaster:作业运行方式Local、Uber、Non-Uber

    基于作业大小因素,MRAppMaster提供了三种作业运行方式:本地Local模式.Uber模式.Non-Uber模式.其中, 1.本地Local模式:通常用于调试: 2.Uber模式:为降低小作业延 ...

  7. Mybatis源码分析之参数处理

    Mybatis对参数的处理是值得推敲的,不然在使用的过程中对发生的一系列错误直接懵逼了. 以前遇到参数绑定相关的错误我就是直接给加@param注解,也稀里糊涂地解决了,但是后来遇到了一些问题推翻了我的 ...

  8. YARN源码分析(一)-----ApplicationMaster

    转自:http://blog.csdn.net/androidlushangderen/article/details/48128955 YARN学习系列:http://blog.csdn.net/A ...

  9. Mybatis源码分析之参数映射及处理ParameterHandler

    ParameterHandler是用来设置参数规则的,当StatementHandler调用prepare方法之后,接下来就是调用它来进行设置参数. ParameterHandler接口: publi ...

随机推荐

  1. Java堆内存不足

    1)使用IDEA开发程序时有时候会提示“Java Heap space error”,说明IDEA默认配置的Java堆内存不足,程序需要更多的堆内存. 2)堆(Heap)和非堆(Non-heap)内存 ...

  2. [OpenJudge8471][划分DP]切割回文

    切割回文 总时间限制: 1000ms 内存限制: 65536kB [描述] 阿福最近对回文串产生了非常浓厚的兴趣. 如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串.例如 ...

  3. C语言实现括号配对问题

    代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> // 写一个判断的括号是否匹配的函数 i ...

  4. NSPredicate 谓词总结 数组过滤 模糊匹配

    NSPredicate 用于指定过滤条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配. NSPredicate常用方法介绍 1.创建NSPredicate(相当于创建一个过滤条件 ...

  5. KVC与KVO的不同

    vc 就是一种通过字符串去间接操作对象属性的机制,  访问一个对象属性我们可以 person.age  也可以通过kvc的方式   [person valueForKey:@"age&quo ...

  6. hidefocus小技巧

    hidefocus即隐藏聚焦,具有使对象聚焦失效的功能,其功能相当于: onFocus="this.blur()" 它的值是一个布尔值,如 hidefocus="true ...

  7. ethtool 命令输出的注意点--网卡参数

    http://blog.csdn.net/msdnchina/article/details/70339689

  8. 【java】java中直接根据Date 获取明天的时间

    展示代码: @Test public void dateTest(){ Date now = new Date(); System.out.println(now); // java.util.Dat ...

  9. 基于3D Vision眼镜的OSG立体显示 【转】

    http://blog.csdn.net/qq_20038925/article/details/50510565 OSG 立体显示 3D Vision眼镜:所实现的是被动立体. 1.本人最近在做os ...

  10. .NET中的CTS、CLS、CLR

    一.解释1 1.CLR(Common Language Runtime) :公共语言运行库 CLR 是CTS(Common Type System:通用类型系统)的实现, 即是说:CLR是应用程序的执 ...