0

我想将 Reducer 结果写入普通文件(例如 .csv 或 .log 文件)而不是写入 HDFS。所以我在reducer类中使用了以下代码:

@Override
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {

    // Standard algorithm for finding the max value
    long sum = 0;
    for (LongWritable value : values) {
        sum++; 
    }

    context.write(key, new LongWritable(sum));
    System.out.println(key + " : " + sum);
    Main.map.put(key.toString(), sum);
}

我将地图的内容打印到 Main 类的 csv 文件中。但是,reducer 完成后,文件为空。我发现地图是空的,因为在减速器类中它没有将任何内容放入地图中,而且我在控制台的减速器中也看不到任何 System.out.println(key + " : " + sum) 。

怎么可能?它们不是在减速器类中处理的吗?

4

1 回答 1

1

让我们在这里找到问题的根源。每个 map 或 reduce 任务都在其自己的 Java 虚拟机 (JVM) 中启动。这些 JVM 不相互共享内存。

假设您进行了以下设置:

  • jvm-1 : JobClient (这是你的主要驱动类)
  • jvm-2:Reducer 任务(这是你的 reducer 正在运行的 JVM)

这就是发生的事情:

  1. jvm-1启动 map/reduce 作业
  2. jvm-2放入一个项目Main.map<K,V>
  3. map/reduce 作业完成。
  4. jvm-1尝试读取,Main.map<K,V>但那里什么也没有,因为jvm-2写入了jvm-1看不到的自己内存中的映射。

类似的事情也会发生System.out。它可能实际上并未附加到stdout流中。很可能(如果您有一个多节点设置),输出将发送到网络上的另一台机器。

于 2013-07-16T22:42:49.150 回答