mapreduce 作业中 map/reduce 个数的计算

1. 问题描述

   当在hadoop集群提交mapreduce作业时,map 和 reduce 的个数是如何计算的?

 

2. map个数的计算

   2.1  map个数的计算和分片大小(splitSize)是有关系的,所以我们先看看splitSize的计算公式:

 long splitSize =   Math.max(minSize, Math.min(maxSize, blockSize))
  2.2  计算公式参数说明及源码查看:

   minSize:  Math.max(1, mapreduce.input.fileinputformat.split.minsize配置的大小 默认是1)

  maxSize: mapreduce.input.fileinputformat.split.maxsize 配置的大小,默认为Long.MAX_VALUE

  blockSize: hdfs快的大小,看集群配置 e.g. 128M  

  当我们计算出splitSize后,遍历 FileInputFormat.addInputPath 配置路径中的每个文件,如果文件/ splitSize  > 1.1 ,则取splitSize 作为一个map输入分片,剩下的文件大小 继续判断  文件/ splitSize  > 1.1 ,直到 <= 1.1   ;如果文件/ splitSize  <= 1.1 则 直接将该文件作为一个map输入分片 。 文字表述有点饶,直接上源代码(FileInputFormat类):

  代码很简单,我大致列了8 个步骤,下面对8个步骤进行说明:

        步骤1:计算minSize,见上面参数说明

        步骤2: 计算maxSize ,见上面参数说明

        步骤3: 遍历FileInputFormat.addInputPath路径中的文件,即我们配置的数据源

        步骤4: 判断文件是否是 可拆分的文件,如果文件不可拆分,则上述的公式不可用,不可拆分的文件包括压缩文件等

        步骤5: 计算splitSize 大小,见上面 splitSize 计算公式

        步骤6: while(剩余文件/ splitSize  > 1.1)  备注:SPLIT_SLOP=1.1 ,如果成立,则splitSize 作为一个map的输入,剩余文件大小:bytesRemaining -= splitSize ;

      步骤7: 跳出步骤6中的while循环后,如果剩余文件不为0,则剩下的文件单独作为一个map的输入

      步骤8: 如果文件是不可分的,则整个文件都当作一个map的输入

 

3. reduce个数的计算

    3.1  决定reduce个数的参数配置      

        reduce的个数,可以直接在client 代码中设置 e.g.  job.setNumReduceTasks(100) ; 即reduce的个数设置为100个,如果我们没有手动配置了,该如何计算呢?

      查看源代码 job.setNumReduceTasks(100),即配置 JobContext.NUM_REDUCES("mapreduce.job.reduce") 属性为参数n,源码:public void setNumReduceTasks(int n) { setInt(JobContext.NUM_REDUCES, n); } 即reduce的个数等于mapreduce.job.reduce 属性value。该属性的默认值为1,如果想要配置全局值,可以在mapred-site.xml 文件中配置。

 

4. 案例分析

    4.1  输入源( FileInputFormat.addInputPath)是按天 和 小时 分区的,格式是orc文件(可拆分),一个小时拆分成2个文件,每个文件都是1M~20M 不等,mapreduce.input.fileinputformat.split.minsize 和mapreduce.input.fileinputformat.split.maxsize 都没有配置,hdfs block size 为128M, 每次任务仅仅跑一天的数据。

     根据上述公式 计算可得:

      minSize =1;

      maxSize = Long.MAX.VALUE;  

      blockSize = 134,217,728 (128M);

     那splitSize = 128M;

因为一天的文件有48个,因为每个文件1M~20M,即每个文件用一个map处理,即有48个map

       4.2 mapreduce.job.reduce 在mapred-site.xml 文件中配置为112 ,如下:

      

且client 代码中没有手动设置setNumReduceTasks 数量,即reduce个数应该是112。 分析下后,查看job 的详细信息截图如下:

 和上述分析的一致
————————————————
版权声明:本文为CSDN博主「hi蜗牛慢跑」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lidaxueh_heart/article/details/82968286

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值