Hadoop将输出写入普通文件

时间:2013-07-16 21:02:54

标签: java hadoop hdfs

我想将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完成后,文件为空。我发现地图是空的,因为在reducer类中它没有把任何东西放到地图中,我也无法在控制台的reducer中看到任何System.out.println(key +“:”+ sum)。

怎么可能?它们不在reducer类中处理?

1 个答案:

答案 0 :(得分:1)

让我们来看看这个问题的根源。每个map或reduce任务都在其自己的Java虚拟机(JVM)中启动。这些JVM不会彼此共享内存。

假设您有以下设置:

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

这就是:

  1. jvm-1 启动地图/减少作业
  2. jvm-2 将项目放入Main.map<K,V>
  3. map / reduce job完成。
  4. jvm-1 尝试从Main.map<K,V>读取,但没有任何内容,因为 jvm-2 在自己的内存中写入 jvm -1 将无法看到。
  5. 类似的事情发生在System.out。它实际上可能不会附加到stdout流。可能(如果您有多节点设置),输出将转到网络上的另一台机器。