我理解为了在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 { }
非常感谢提前!
答案 0 :(得分:4)
Combiner
应该只是Reducer
,因此实现Reducer
接口(没有Combiner
接口)。将合并步骤视为Mapper
和Reducer
之间的一种中介减少步骤。
采用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()或其他任何要覆盖的方法。