reducer可以在Hadoop中容纳实例变量吗?

时间:2014-07-08 09:06:24

标签: java hadoop mapreduce

我在互联网上看到关于Reducer有实例变量

的示例
public static class MyReducer extends Reducer<IntWritable, Text, IntWritable, Text> {

    private TreeMap<Integer, Long> counts = new TreeMap<Integer, Long>();

    public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        /* populate TreeMap */
    }
}

如果MyReducer对象的一个​​实例用于减少多个密钥,那么我们应该在某个地方清除count。我们应该在哪里这样做?或者,MyReducer的一个实例将用于一个key。如果该密钥更改,则将创建MyReducer的新实例。它是否正确?所以实际问题是:如果我们有一个reducer任务,会创建多少Reducer个对象?一?或者它是按键创建的?

1 个答案:

答案 0 :(得分:4)

每个任务有一个Reducer个实例,而不是每个键。然后,为每个键调用reduce函数一次,因此如果在shuffle之后一个reducer有4个键,那么它的reduce函数将被调用4次。

至于代码的特定示例,它不需要清除变量,因为我猜它是存储每个键的值的计数。由于每个密钥都会调用一次函数,因此使用密钥作为TreeMap的密钥,它将在TreeMap中存储每个密钥的计数。