如何在一个reducer中同时处理所有map输出?

798qvoo8  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(285)

我编写了一个mapreduce应用程序,其中Map器以以下形式生成输出:

key1    value1
 key2    value2
 keyn    valuen

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

sum = value1+value2+value3

有可能吗?据我目前所知,每个键/值对分别调用reducer。我想到的一个解决方案是使用一个私有的sum变量来维护迄今为止在其中的值的总和。然而,在这种情况下,我怎么知道所有的对都已经处理好了,这样总和就可以写入收集器了?

qcuzuvrc

qcuzuvrc1#

我也是hadoop新手,在研究同一个问题时,我发现mapper和reducer类还有setup()和cleanup()方法以及map()和reduce()。

首先,将减速器的数量设置为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));
  }
}
brccelvz

brccelvz2#

如果你不需要钥匙,那就用一个固定的钥匙。如果必须有多个键值,可以将reducer数设置为1,并使用reducer类中的示例变量来保存所有值的总和。在setup()方法中初始化变量,并在close()方法中报告总总和。
另一种方法是通过在reduce方法中增加一个计数器来写入给定键的值之和。让hadoop将所有值合并到一个计数器值中。

相关问题