如何在hadoopmapreduce中实现合并器?

hivapdat  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(383)

我知道在hadoopmapreduce中包含一个合并器需要包含以下几行代码(我已经完成了);

conf.setCombinerClass(MyReducer.class);

我不明白的是,我在哪里真正实现合并器的功能。我要在myreducer下创建一个combine{}方法吗?如还原法;

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

非常感谢!

zxlwwiss

zxlwwiss1#

Combiner 应该只是一个 Reducer ,从而实现 Reducer 接口(没有 Combiner 接口)。把组合步骤看作是两个步骤之间的一种中介减少步骤 Mapper 以及 Reducer .
以字数计算为例。雅虎教程:
单词计数是组合器有用的一个主要例子。清单1-3中的word count程序为它看到的每个单词的每个示例发出一个(word,1)对。因此,如果同一个文档包含单词“cat”3次,则该对(“cat”,1)将发出3次;所有这些都被送到减速器。通过使用合路器,这些可以压缩成一对(“cat”,3)发送到减速器。现在每个节点只为每个字向reducer发送一个值——大大减少了洗牌过程所需的总带宽,并加快了作业的速度。最好的一点是,我们不需要编写任何额外的代码来利用这一点!如果reduce函数既是交换函数又是结合函数,那么它也可以用作组合器。
希望有帮助。

nr9pn0ug

nr9pn0ug2#

考虑到您的代码段,您只需要像往常一样实现reduce()方法,这里没有什么特别的事情要做。但是,请记住,组合器函数是一个优化。这意味着hadoop不能保证为特定的map输出调用它多少次。它可能根本不叫它。
如果您检查hadoop reducer类的api,就会发现reduce()方法。没有combine()或任何其他要重写的方法。

相关问题