如何同时在一个减速器中处理所有的地图输出



我编写了一个MapReduce应用程序,其中映射器以以下形式产生输出:

 key1    value1
 key2    value2
 keyn    valuen

我要做的是对我的减速器中所有键的值求和。基本上:

sum = value1+value2+value3

这可能吗?根据我目前的理解,每个键/值对分别调用减速器。我想到的一个解决方案是使用一个私有sum变量来维护到目前为止在其中的值过程的总和。然而,在这种情况下,我如何知道所有的数据对都已被处理,从而可以将总和写入收集器?

如果你不需要这个键,那么就使用一个固定的键。如果必须有几个键值,可以将reducer的数量设置为1,并在reducer类中使用实例变量来保存所有值的总和。在setup()方法中初始化变量,并在close()方法中报告总和。

另一种方法是通过使用reduce方法中的sum对计数器进行加1来写入给定键值的和。让hadoop把所有的值放在一个计数器值中

我也是Hadoop的新手,在做同样问题的研究时,我发现Mapper和Reducer类也有setup()和cleanup()方法以及map()和reduce()。

首先,设置reducer的个数为1。

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
int sum=0
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
      for (IntWritable value : values) 
        {
            sum += value.get();
        }
}
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
  context.write(new Text("Sum:", new IntWritable(sum));
  }
}

最新更新