hadoop使用mapreduce统计词频_Combiner组件创建和使用演示

在Map阶段输出可能会产生大量相同的数据,例如 、 ……,势必会降低Reduce聚合阶段的执行效率。Combiner组件的作用就是对Map阶段的输出的重复数据先做一次合并计算,然后把新的(key,value)作为Reduce阶段的输入。图1描述的就是Combiner组件对Map的合并操作。

97d1f2e0d2c945b3e42faf7e9d2b5751.png
图1 Combiner组件的合并操作

Combiner组件是MapReduce程序中的一种重要的组件,如果想自定义Combiner,我们需要继承Reducer类,并且重写reduce()方法。接下来,我们针对词频统计案例编写一个Combiner组件,演示如何创建和使用Combiner组件,具体代码,如文件所示。

文件 WordCountCombiner.java

import java.io.IOException;

   import org.apache.hadoop.io.IntWritable;

   import org.apache.hadoop.io.Text;

   import org.apache.hadoop.mapreduce.Reducer;

   public class WordCountCombiner extends Reducer<Text, 

                     IntWritable, Text, IntWritable> {

     @Override

     protected void reduce(Text key, Iterable<IntWritable> values,

         Reducer<Text, IntWritable, Text, IntWritable>.Context 

             context) throws IOException, InterruptedException {

      // 局部汇总

      int count = 0;

      for (IntWritable v : values) {

        count += v.get();

      }

      context.write(key, new IntWritable(count));

    }

  }

文件是自定义Combiner类,它的作用就是将key相同的单词汇总(这与WordCountReducer类的reduce()方法相同,也可以直接指定WordCountReducer作为Combiner类),另外还需要在主运行类中为Job设置Combiner组件即可,具体代码如下:

wcjob.setCombinerClass(WordCountCombiner.class);

小提示:

执行MapReduce程序,添加与不添加Combiner结果是一致的。通俗的讲,无论调用多少次Combiner,Reduce的输出结果都是一样的,因为Combiner组件不允许改变业务逻辑。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值