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


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

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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()方法中,有如下代码:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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,如下:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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是按照以下方式进行处理的,如下:

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

            我们看到,在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。处理该参数相关代码如下:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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.   
    6.   // make sure reduces are scheduled only after all map are completed  
    7.   conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART,  
    8.                     1.0f);  
    9. //......省略后续相关代码  
  • 相关阅读:
    ViewPager+GridView实现首页导航栏布局分页效果
    RecyclerView和PullToRefreshListView的对比
    信鸽推送的使用
    2020重新出发,JAVA设计模式 之十 外观模式
    2020重新出发,JAVA设计模式 之九 装饰模式
    2020重新出发,JAVA设计模式 之八 桥接模式
    2020重新出发,JAVA设计模式 之七 适配器模式
    2020重新出发,JAVA设计模式 之六 代理模式
    2020重新出发,JAVA设计模式 之五 建造者模式
    2020重新出发,JAVA设计模式 之四 抽象工厂模式
  • 原文地址:https://www.cnblogs.com/jirimutu01/p/5556367.html
Copyright © 2020-2023  润新知