Java 如何在Hadoop MapReduce中实现合并器?
我理解在Hadoop MapReduce中包含一个合并器,包括以下几行(我已经做了) 我不明白的是,我到底在哪里实现组合器的功能。我是否在MyReducer下创建一个combine{}方法?如还原法Java 如何在Hadoop MapReduce中实现合并器?,java,hadoop,mapreduce,elastic-map-reduce,Java,Hadoop,Mapreduce,Elastic Map Reduce,我理解在Hadoop MapReduce中包含一个合并器,包括以下几行(我已经做了) 我不明白的是,我到底在哪里实现组合器的功能。我是否在MyReducer下创建一个combine{}方法?如还原法 public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOExce
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { }
public void reduce(文本键、迭代器值、,
OutputCollector输出,报告器报告器)引发IOException{}
非常感谢 考虑到您的代码片段,您只需要像往常一样实现reduce()方法,这里没有什么特别的事情要做。但是,请记住,组合器功能是一种优化。这意味着Hadoop不能保证它会为特定的映射输出调用它多少次。它可能一点也不叫它
如果您检查类的API,您将找到reduce()方法。没有要重写的combine()或任何其他方法。考虑到您的代码段,您只需要像往常一样实现reduce()方法,这里没有什么特别的事情要做。但是,请记住,组合器功能是一种优化。这意味着Hadoop不能保证它会为特定的映射输出调用它多少次。它可能一点也不叫它
如果您检查类的API,您将找到reduce()方法。没有combine()或任何其他要重写的方法。Combiner应该只是一个
Reducer
,从而实现Reducer
接口(没有Combiner
接口)。将组合步骤视为映射器
和还原器
之间的一种中间缩减步骤
以单词计数为例。发件人:
字计数是组合器有用的主要示例。清单1--3中的单词计数程序为它看到的每个单词的每个实例发出一个(单词,1)对。因此,如果同一文档包含单词“cat”3次,则该对(“cat”,1)将发出3次;所有这些都将被发送到减速器。通过使用合路器,可将其压缩成一对(“cat”,3)并发送至减速器。现在,每个节点只为每个字向reducer发送一个值——大大减少了洗牌过程所需的总带宽,并加快了作业的速度。最好的一点是,我们不需要编写任何额外的代码来利用这一点!如果reduce函数既是交换函数又是结合函数,那么它也可以用作组合器
希望能有所帮助。A
Combiner
应该只是一个Reducer
,从而实现Reducer
接口(没有Combiner
接口)。将组合步骤视为映射器
和还原器
之间的一种中间缩减步骤
以单词计数为例。发件人:
字计数是组合器有用的主要示例。清单1--3中的单词计数程序为它看到的每个单词的每个实例发出一个(单词,1)对。因此,如果同一文档包含单词“cat”3次,则该对(“cat”,1)将发出3次;所有这些都将被发送到减速器。通过使用合路器,可将其压缩成一对(“cat”,3)并发送至减速器。现在,每个节点只为每个字向reducer发送一个值——大大减少了洗牌过程所需的总带宽,并加快了作业的速度。最好的一点是,我们不需要编写任何额外的代码来利用这一点!如果reduce函数既是交换函数又是结合函数,那么它也可以用作组合器
希望这能有所帮助。我刚刚意识到我问了如何“实现减速器的功能”而不是“组合器”,很抱歉,它现在已经修复了。请你再回答一遍好吗?@ali取决于你的情况和数据。不能说我刚刚意识到我问过如何“实现减速器的功能”而不是“组合器”,很抱歉,它现在已经修复了。请你再回答一遍好吗?@ali取决于你的情况和数据。不能说
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { }