2013-07-16 93 views
0

我想将Reducer结果写入普通文件(例如.csv或.log文件),而不是写入HDFS。所以我用下面的代码在减速机类:Hadoop将输出写入普通文件

@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); 
} 

我打印地图的内容到主类csv文件。但是,减速机完成后,文件是空的。我发现地图是空的,因为在reducer类中它没有放置任何东西到地图中,我也看不到控制台中reducer中的任何System.out.println(key +“:”+ sum)。

这怎么可能?他们不是在减速机班处理?

+0

你到底想要完成什么? – climbage

+0

例如我运行word count,hadoop jar word count.jar输入输出,除了将输出写入HDFS之外,我还想将结果写入诸如result.log之类的日志文件中,并且此result.log与输出文件在HDFS – user2552010

回答

1

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

比方说,你有以下设置:

  • JVM-1:JobClient(这是你的主要驱动器类)
  • JVM-2:减速机的任务(这是JVM你减速机在运行)

这是发生了什么:

  1. JVM-1发起地图/减少作业
  2. JVM-2放入Main.map<K,V>
  3. 地图的项目/减少作业完成。
  4. JVM-1,尝试从Main.map<K,V>读,但有什么都没有,因为JVM-2在自己的内存写信给一个地图,JVM-1不会看到。

类似的事情发生在System.out。它实际上可能不会附加到stdout流。很可能(如果您有多节点设置),输出将转到网络上的另一台计算机。

+0

好的...如果它是这样的,我该怎么办?我怎样才能将reducer结果打印到文件中? – user2552010