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 的详细信息截图如下:

 

 和上述分析的一致

  

   

  

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贝叶斯文本分类器是一种常用的机器学习算法,可以用于将文本数据进行分类。基于Java和Map/ReduceMapReduce)框架实现贝叶斯文本分类器的设计可以分为以下几个步骤: 1. 数据预处理:首先,需要将文本数据进行预处理,包括去除停用词、标点符号、数字等非关键信息,并进行分词操作,将每个文本分割成一个个词语。 2. 计算词语频率:使用Map/Reduce框架,将每个文本的词语作为键,将出现的频率作为值进行统计。Map阶段将每个文本拆分成词语,并为每个词语设置初始频率为1。Reduce阶段将相同的词语进行合并,并计算总频率。 3. 计算词语条件概率:对于每个类别,需要计算每个词语的条件概率。通过Map阶段将每个词语与它所属的类别作为键值对进行传输。Reduce阶段将相同的词语进行合并,并统计该词语在每个类别的频率。 4. 计算类别概率:通过Map/Reduce框架,将每个文本的类别作为键进行传输。Reduce阶段将相同的类别进行合并,并统计该类别在整个文本集的频率。 5. 应用贝叶斯公式:对于一个新的文本,首先将其进行预处理,并计算出每个词语在各个类别的条件概率。然后,根据贝叶斯公式,将各个词语的条件概率相乘,再乘以各个类别的概率,最终得到该文本属于每个类别的概率。根据概率大小,将文本分类到最可能的类别。 以上就是基于Java和Map/Reduce实现的贝叶斯文本分类器的设计。这种设计可以充分利用Map/Reduce框架的并行计算能力,加快计算速度,提高分类器的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值