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. NHibernate官方文档中文版--只读实体类型(Read-only entities)

    重点 NHIbernate处理只读对象的方式可能和你在别处看到的不同.不正确的使用方式可能造成不可预料的结果. 当一个实体是只读的时候: NHIbernate不会对实体的简单属性和单向关联数据检查数据 ...

  2. winfrom GDI知识

     c#使用GDI+简单绘图 http://blog.csdn.net/smartsmile2012/article/details/30255303 NET3.5 GDI+ 图形操作1 http:// ...

  3. javascript设计模式 第一章 灵活的javascript

    javascript 设计模式 第1章 灵活的语言--JavaScript 初级程序员接到一个验证表单功能的任务,需要验证用户名.邮箱.密码等 ** 此文章内容大部分来自 <javascript ...

  4. javascript(JQuery)元素操作

    html代码如下: <div id="picK"> <ul> <li style="float:left;width:90px;" ...

  5. MVC Movie App

    ylbtech- ASP.NET MVC:MVC Movie App 功能描述:MVC Movie App 2,TechnologyAndTheEnvironment(技术与环境) 操作系统: win ...

  6. GSM模块_GPRS数据传输机制和原理

    通信专业术语 BSS--基站子系统,通过无线接口与移动台直接联系,负责在一定区域内和移动台通信.(GSM) BTS--基站收发台,可以看作一复杂的无线调制器,BSS的主要部分,每个分配有若干信道.(G ...

  7. vmware三种网络连接模式区别

    vmware有三种网络连接模式分别是 桥接模式 相当于给虚拟机分配了一个和主机同一个子网下的ip,此时该虚拟机相当于同一子网中一台主机,可以访问子网中任意一台主机,也可以访问外网. NAT模式 虚拟机 ...

  8. Laravel 5系列教程四:数据库和Eloquent

    免费视频教程地址https://laravist.com/series/laravel-5-basic 上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方式, 这一节我们来说说 ...

  9. Java 多线程之 synchronized 和 volatile 的比較

    概述 在做多线程并发处理时,常常须要对资源进行可见性訪问和相互排斥同步操作.有时候,我们可能从前辈那里得知我们须要对资源进行 volatile 或是 synchronized 关键字修饰处理.但是,我 ...

  10. 《暗黑世界V1.6》服务器代码执行图

    <暗黑世界V1.6>服务器代码执行图 (原文地址:http://www.9miao.com/forum.php?mod=viewthread&tid=44016&highl ...