如何在Hadoop MapReduce中实现组合器?

时间:2014-03-13 12:58:15

标签: java hadoop mapreduce elastic-map-reduce

我理解为了在Hadoop MapReduce中包含一个组合器,包括以下行(我已经完成了);

   conf.setCombinerClass(MyReducer.class);

我不明白的是,我在哪里实际实现了合并器的功能。我是否在MyReducer下创建了一个combine {}方法?如reduce方法;

  public void reduce(Text key, Iterator<IntWritable> values,
  OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { }

非常感谢提前!

2 个答案:

答案 0 :(得分:4)

Combiner应该只是Reducer,因此实现Reducer接口(没有Combiner接口)。将合并步骤视为MapperReducer之间的一种中介减少步骤。

采用Word Count示例。来自Yahoo's tutorial

  

字数是组合器有用的主要示例。清单1--3中的字数统计程序为它看到的每个单词的每个实例发出一个(字,1)对。因此,如果同一文档包含3次单词“cat”,则该对(“cat”,1)将被发出三次;所有这些都被发送到Reducer。通过使用组合器,可以将它们压缩成单个(“cat”,3)对以发送到Reducer。现在,每个节点只向每个单词的reducer发送一个值 - 大大减少了shuffle进程所需的总带宽,并加快了工作速度。最好的部分是我们不需要编写任何额外的代码来利用这一点!如果reduce函数既可交换又是关联的,那么它也可以用作组合器。

希望有所帮助。

答案 1 :(得分:0)

考虑到您的代码段,您只需像往常一样实施 reduce()方法,这里没有什么特别的事情可做。但是,请记住组合器功能是一种优化。这意味着Hadoop不会为特定地图输出调用它提供多少次保证。它可能根本不会调用它。

如果检查Hadoop Reducer类的API,则会找到reduce()方法。没有combine()或其他任何要覆盖的方法。