我编写了一个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));
}
}