我正在尝试使用 reducer 类中的 MAP_OUTPUT_RECORDS 计数器来计算示例 wordcount 程序中的单词百分比。
这里是 reducer 中 setup()
方法的代码:
public static class IntSumReducer extends
Reducer<Text,FloatWritable,Text,FloatWritable> {
private FloatWritable result = new FloatWritable();
private long total = 0;
@Override
public void setup(Context context) throws IOException , InterruptedException{
total = context.getCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue();
System.out.println("total : " + total);
}
这是最后一行打印语句的输出:
总计:1131
总计:487
总计:421
总计:333
总计:101
总计:101
总计:l95
总计:l85
总计:0
我不明白:
- 为什么多次调用
setup()
方法?根据定义,它应该只在任务开始时被调用一次。 - 为什么“MAP_OUTPUT_RECORDS”的值不断变化?它不应该是一个独特的值(value)吗? (所有映射器的总输出加起来)?
我认为 reducer 不会在所有映射器完成执行之前启动。为什么“MAP_OUTPUT_RECORDS”值不是常量?
最佳答案
“任何reduce函数调用都应该在所有映射器完成之后 他们的工作”。
只有在显式关闭推测执行时才严格为真。 否则,某些 reduce 任务有可能在所有映射完成之前实际开始。
为此,请检查链接,
1) 关于 setup() 方法调用,可能会为您的作业启动多个 reducer,并且对于每个 reducer,都会调用 setup 方法。 请检查,
setup and cleanup methods of Mapper/Reducer in Hadoop MapReduce
2) MAP_OUTPUT_RECORDS 不断变化,因为根据 Hadoop 权威指南,
MAP_OUTPUT_RECORDS: "作业中所有 map 生成的 map 输出记录数。 每次在 map 的 OutputCollector 上调用 collect() 方法时递增。
映射器可能正在运行,同时调用了 reducer 的 setup() 方法,因此每次调用都会更改 MAP_OUTPUT_RECORDS。
希望这个回答对您有所帮助。
关于java - MAP_OUTPUT_RECORDS 值在 reducer 类中不断变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34173039/