我知道在hadoopmapreduce中包含一个合并器需要包含以下几行代码(我已经完成了);
conf.setCombinerClass(MyReducer.class);
我不明白的是,我在哪里真正实现合并器的功能。我要在myreducer下创建一个combine{}方法吗?如还原法;
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { }
非常感谢!
2条答案
按热度按时间zxlwwiss1#
一
Combiner
应该只是一个Reducer
,从而实现Reducer
接口(没有Combiner
接口)。把组合步骤看作是两个步骤之间的一种中介减少步骤Mapper
以及Reducer
.以字数计算为例。雅虎教程:
单词计数是组合器有用的一个主要例子。清单1-3中的word count程序为它看到的每个单词的每个示例发出一个(word,1)对。因此,如果同一个文档包含单词“cat”3次,则该对(“cat”,1)将发出3次;所有这些都被送到减速器。通过使用合路器,这些可以压缩成一对(“cat”,3)发送到减速器。现在每个节点只为每个字向reducer发送一个值——大大减少了洗牌过程所需的总带宽,并加快了作业的速度。最好的一点是,我们不需要编写任何额外的代码来利用这一点!如果reduce函数既是交换函数又是结合函数,那么它也可以用作组合器。
希望有帮助。
nr9pn0ug2#
考虑到您的代码段,您只需要像往常一样实现reduce()方法,这里没有什么特别的事情要做。但是,请记住,组合器函数是一个优化。这意味着hadoop不能保证为特定的map输出调用它多少次。它可能根本不叫它。
如果您检查hadoop reducer类的api,就会发现reduce()方法。没有combine()或任何其他要重写的方法。