Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:         mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.

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

  // 当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.05
  public static final String COMPLETED_MAPS_FOR_REDUCE_SLOWSTART = "mapreduce.job.reduce.slowstart.completedmaps";
        那么这个参数在Yarn中是如何使用的呢?本文我们将解答这个问题。

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

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

      scheduleReduces(
          getJob().getTotalMaps(), completedMaps,
          scheduledRequests.maps.size(), scheduledRequests.reduces.size(), 
          assignedRequests.maps.size(), assignedRequests.reduces.size(),
          mapResourceRequest, reduceResourceRequest,
          pendingReduces.size(), 
          maxReduceRampupLimit, reduceSlowStart);
        scheduleReduces()方法是专门处理Reduce任务相关资源申请调度的,其中对于reduceSlowStart是按照以下方式进行处理的,如下:

    //check for slow start
    // 在Reduce调度尚未启动时,即标志位reduceStarted为false时
    if (!getIsReduceStarted()) {//not set yet
    	
      // 计算Reduce Task启动时最低要求完成的Map Task数目completedMapsForReduceSlowstar,
      // 计算公式为reduceSlowStart * totalMaps,向上取整,totalMaps表示Map Task总数目
      int completedMapsForReduceSlowstart = (int)Math.ceil(reduceSlowStart * 
                      totalMaps);
      
      // 如果已完成Map Task数目completedMaps小于上述要求完成的Map Task数目completedMapsForReduceSlowstart,
      // 记录info级别日志信息:Reduce slow start threshold not met.completedMapsForReduceSlowstart ?
      // 即Reduce任务最低启动门槛没有满足,并输出最低启动门槛,即要求已完成的Map Task数目:completedMapsForReduceSlowstart数目,然后返回,不进行资源申请调度
      if(completedMaps < completedMapsForReduceSlowstart) {
        LOG.info("Reduce slow start threshold not met. " +
              "completedMapsForReduceSlowstart " + 
            completedMapsForReduceSlowstart);
        return;
      } else {
    	// 如果达到了最低启动门槛,同样记录info级别日志信息:Reduce slow start threshold reached. Scheduling reduces.
    	// 即Reduce最低启动门槛已达到,开始调度Reduce
        LOG.info("Reduce slow start threshold reached. Scheduling reduces.");
        // 并设置标志位reduceStarted为true,即该Reduce资源申请已被调度
        setIsReduceStarted(true);
      }
    }
        我们看到,在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。处理该参数相关代码如下:

    if (isUber) {
      LOG.info("Uberizing job " + jobId + ": " + numMapTasks + "m+"
          + numReduceTasks + "r tasks (" + dataInputLength
          + " input bytes) will run sequentially on single node.");

      // make sure reduces are scheduled only after all map are completed
      conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART,
                        1.0f);
    //......省略后续相关代码







相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
资源调度 分布式计算 调度
27 MAPREDUCE与YARN
27 MAPREDUCE与YARN
69 0
|
分布式计算 资源调度 大数据
黑马程序员-大数据入门到实战-MapReduce & YARN入门
黑马程序员-大数据入门到实战-MapReduce & YARN入门
151 0
|
2月前
|
分布式计算 资源调度 Hadoop
在YARN集群上运行部署MapReduce分布式计算框架
主要介绍了如何在YARN集群上配置和运行MapReduce分布式计算框架,包括准备数据、运行MapReduce任务、查看任务日志,并启动HistoryServer服务以便于日志查看。
65 0
|
3月前
|
分布式计算 资源调度 监控
MapReduce程序中的主要配置参数详解
【8月更文挑战第31天】
93 0
|
3月前
|
SQL 资源调度 数据处理
实时计算 Flink版产品使用问题之-s参数在yarn-session.sh命令中是否有效
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
分布式计算 资源调度 数据处理
YARN支持哪些非基于MapReduce的计算模型?
【6月更文挑战第19天】YARN支持哪些非基于MapReduce的计算模型?
70 11
|
6月前
|
资源调度 分布式计算 Hadoop
Hadoop Yarn 核心调优参数
这是一个关于测试集群环境的配置说明,包括3台服务器(master, slave1, slave2)运行CentOS 7.5,每台有4核CPU和4GB内存。集群使用Hadoop 3.1.3,JDK1.8。Yarn核心配置涉及调度器选择、ResourceManager线程数、节点检测、逻辑处理器使用、核心转换乘数、NodeManager内存和CPU设置,以及容器的内存和CPU限制。配置完成后,需要重启Hadoop并检查yarn配置。
116 4
|
6月前
|
分布式计算 Hadoop Java
Hadoop MapReduce 调优参数
对于 Hadoop v3.1.3,针对三台4核4G服务器的MapReduce调优参数包括:`mapreduce.reduce.shuffle.parallelcopies`设为10以加速Shuffle,`mapreduce.reduce.shuffle.input.buffer.percent`和`mapreduce.reduce.shuffle.merge.percent`分别设为0.8以减少磁盘IO。
74 1
|
存储 分布式计算 资源调度
提交MapReduce程序至YARN执行
提交MapReduce程序至YARN执行
120 0
|
分布式计算 Java Hadoop
39 MAPREDUCE参数优化
39 MAPREDUCE参数优化
70 0

热门文章

最新文章

下一篇
无影云桌面