我试图在reducer类中使用MAP_OUTPUT_RECORDS计数器来计算示例wordcount程序中单词的百分比。
这是化简器中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);
}
这是最后一行中print语句的输出:
合计:1131
合计:487
总数:421
合计:333
合计:101
合计:101
合计:l95
合计:l85
合计:0
我不明白:
setup()
方法被多次调用?根据定义,在任务开始时仅应调用一次。 我不认为 reducer 会在所有映射器完成执行之前启动。为什么“MAP_OUTPUT_RECORDS”值不是常数?
最佳答案
“任何reduce函数调用都应该在所有映射器都完成之后
他们的工作”。
仅当显式执行被显式关闭时,才为true。
否则,可能有一些reduce任务实际上可以在所有映射完成之前开始。
为此,请检查链接,
http://mail-archives.apache.org/mod_mbox/hadoop-common-user/201002.mbox/%3C5f6b7e1002011502u774934f9x5800590f264a933a@mail.gmail.com%3E
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。
我希望这个答案会有所帮助。