Java Hadoop将输出写入普通文件

Java Hadoop将输出写入普通文件,java,hadoop,hdfs,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 v

我想将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);
}
@覆盖
公共void reduce(文本键、Iterable值、上下文上下文)引发IOException、InterruptedException{
//求最大值的标准算法
长和=0;
for(可长写值:值){
sum++;
}
write(key,新的LongWritable(sum));
System.out.println(键+“:”+和);
Main.map.put(key.toString(),sum);
}
我将地图的内容打印到主类中的csv文件中。但是,在reducer完成后,文件是空的。我发现映射是空的,因为在reducer类中,它没有将任何内容放入映射中,而且我在控制台的reducer中也看不到任何System.out.println(key+“:”+sum)


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

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

假设您有以下设置:

  • jvm-1:JobClient(这是您的主要驱动程序类)
  • jvm-2:Reducer任务(这是运行Reducer的jvm)
情况就是这样:

  • jvm-1启动映射/缩减作业
  • jvm-2将一个项目放入
    Main.map
  • 映射/减少作业完成
  • jvm-1尝试从
    Main.map
    读取,但是没有任何内容,因为jvm-2在自己的内存中写入了一个jvm-1看不到的映射

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

    你到底想通过这个实现什么?例如,我运行word count,hadoop jar word count.jar输入输出,除了将输出写入HDFS之外,我还想将结果写入一个日志文件,比如result.log,这个result.log与HDFSok中的输出文件完全相同……如果是这样,我该怎么办?如何将结果打印到文件中?