Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍
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); //......省略后续相关代码

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Yarn源码分析之MRAppMaster:作业运行方式Local、Uber、Non-Uber
基于作业大小因素,MRAppMaster提供了三种作业运行方式:本地Local模式、Uber模式、Non-Uber模式。其中, 1、本地Local模式:通常用于调试; 2、Uber模式:为降低小作业延迟而设计的一种模式,所有任务,不管是Map Task,还是Reduce Task,均在同一个Container中顺序执行,这个Container其实也是MRAppMaster所在Container; 3、Non-Uber模式:对于运行时间较长的大作业,先为Map Task申请资源,当Map Task运行完成数目达到一定比例后再为Reduce Task申请资源。 在Yarn中,作业运行的资源,统一被抽象为容器Container,在MRAppMaster中关于作业运行时需要的资源的分配与加载代码中,容器分配申请服务、容器分配完成后加载服务中,都有关于Uber模式和Non-Uber模式的处理,如下: 1、容器分配申请路由服务 容器分配申请路由服务ContainerAllocatorRouter继承自AbstractService,是Hadoop中一...
- 下一篇
CCAH-CCA-500-3题:Table schemas in Hive are?
3.Table schemas in Hive are: A. Stored as metadata on the NameNode B. Stored along with the data in HDFS C. Stored in the Metadata D. Stored in ZooKeeper 问题: Hive组件的table schemas在哪里存储着? 解析: Hive分为元数据metadata和数据data,元数据一般存储在mysql中(默认在derby),数据存储在hdfs文件系统上. 元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等. 在安装过程,我们一般会初始化schema,在服务端执行一次“schematool -dbType mysql -initSchema”,以完成对metastore的初始化,所以 table schemas are stored in the metadata at the mysql database.
相关文章
文章评论
共有0条评论来说两句吧...