java - MAP_OUTPUT_RECORDS 值在 reducer 类中不断变化

标签 java hadoop mapreduce

我正在尝试使用 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

我不明白:

  1. 为什么多次调用 setup() 方法?根据定义,它应该只在任务开始时被调用一次。
  2. 为什么“MAP_OUTPUT_RECORDS”的值不断变化?它不应该是一个独特的值(value)吗? (所有映射器的总输出加起来)?

我认为 reducer 不会在所有映射器完成执行之前启动。为什么“MAP_OUTPUT_RECORDS”值不是常量?

最佳答案

“任何reduce函数调用都应该在所有映射器完成之后 他们的工作”。

只有在显式关闭推测执行时才严格为真。 否则,某些 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。

希望这个回答对您有所帮助。

关于java - MAP_OUTPUT_RECORDS 值在 reducer 类中不断变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34173039/

相关文章:

Hadoop Map-Reduce OutputFormat 用于将结果分配给内存变量(不是文件)?

java - 无法通过Java连接到Hbase

hadoop - 当我在 Hadoop 上运行我自己的代码时出现 ClassNotFoundException

java - Reflect 是否能够加载外部类/jar 作为插件

Java:InvalidAlgorithmParameterException 质数大小必须是 64 的倍数

java - 使用 Jagacy jar 自动化大型机应用程序时,收到错误消息,指出 "KDB16104I Application has not been defined to CICS"

java - java中的字符串搜索(获取java.lang.nullpointerException)

mysql - 将日期转换为配置单元中的时间戳

java - 在mapreduce中访问mapper/reducer类之外的静态HashMap

java - 如何在 mapreduce 中对 map 端程序的输出进行排序?