我在互联网上看到关于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
个对象?一?或者它是按键创建的?
答案 0 :(得分:4)
每个任务有一个Reducer
个实例,而不是每个键。然后,为每个键调用reduce
函数一次,因此如果在shuffle之后一个reducer有4个键,那么它的reduce
函数将被调用4次。
至于代码的特定示例,它不需要清除变量,因为我猜它是存储每个键的值的计数。由于每个密钥都会调用一次函数,因此使用密钥作为TreeMap
的密钥,它将在TreeMap
中存储每个密钥的计数。