Java MAP_OUTPUT_记录值在reducer类中不断变化

Java MAP_OUTPUT_记录值在reducer类中不断变化,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我试图使用reducer类中的MAP\u OUTPUT\u RECORDS计数器来计算示例wordcount程序中的单词百分比 以下是减速器中的setup()方法的代码: public static class IntSumReducer extends Reducer<Text,FloatWritable,Text,FloatWritable> { private FloatWritable result = new FloatWritable();

我试图使用reducer类中的MAP\u OUTPUT\u 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);
    }
公共静态类IntSumReducer扩展
还原剂{
private floatwriteable result=新的floatwriteable();
私人长期合计=0;
@凌驾
公共无效设置(上下文上下文)引发IOException,InterruptedException{
total=context.getCounter(“org.apache.hadoop.mapred.Task$Counter”,“映射输出记录”).getValue();
系统输出打印项次(“总计:+总计);
}
这是最后一行中打印语句的输出:

总数:1131
总数:487 总数:421
总数:333
总数:101
总数:101
总计:1995年
总数:185人
总数:0

我不明白:

  • 为什么要多次调用
    setup()
    方法?根据定义,应该在任务开始时只调用一次
  • 为什么“地图输出记录”的值不断变化?它不应该是一个唯一的值吗?(所有地图绘制者的总输出总和)
  • 我不认为还原程序在所有映射程序完成执行之前启动。为什么“MAP\u OUTPUT\u RECORDS”值不是常量?

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

    仅当投机性执行被显式关闭时,才严格为true。 否则,一些reduce任务可能会在所有映射完成之前实际启动

    为此,请查看链接

    1) 关于setup()方法调用,可能会为您的作业启动多个reducer,并为每个reducer调用setup方法。 请查收

    2) 映射输出记录不断变化,因为根据Hadoop定义指南

    映射输出记录: “作业中所有地图生成的地图输出记录数。 每次在映射的OutputCollector上调用collect()方法时递增”

    映射程序可能正在运行,同时调用reducer的setup()方法,因此每次调用的映射输出记录都会发生变化

    我希望这个答案有帮助。

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

    仅当投机性执行被显式关闭时,才严格为true。 否则,一些reduce任务可能会在所有映射完成之前实际启动

    为此,请查看链接

    1) 关于setup()方法调用,可能会为您的作业启动多个reducer,并为每个reducer调用setup方法。 请查收

    2) 映射输出记录不断变化,因为根据Hadoop定义指南

    映射输出记录: “作业中所有地图生成的地图输出记录数。 每次在映射的OutputCollector上调用collect()方法时递增”

    映射程序可能正在运行,同时调用reducer的setup()方法,因此每次调用的映射输出记录都会发生变化


    我希望这个答案有帮助。

    我不认为还原程序在所有映射程序完成工作之前就开始了。只有记录的洗牌开始了。你有多少个还原程序?我不认为还原程序在所有映射程序完成工作之前就开始了。只有记录的洗牌开始了。你有多少个还原程序?