java - Hadoop 将输出写入普通文件

标签 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);
}

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

怎么会这样呢?它们不是在reducer类中处理的吗?

最佳答案

让我们深入探讨问题的根源。每个映射或化简任务都在其自己的 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溪流。 (如果您有多节点设置),输出很可能会发送到网络上的另一台计算机。

关于java - Hadoop 将输出写入普通文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17686922/

相关文章:

java - 我应该使用 Smarfox Server for flash 还是可以构建我的迷你 java 服务器

java - 为什么 scanner.hasNext() 在读取 Http Request 时阻塞

java - HDFS 文件观察服务

java - 外键引用目标不存在

java - 具有渲染属性的 jsf 组件验证失败

mysql - 将日期转换为配置单元中的时间戳

hadoop - MapReduce Mrunit 错误

apache - Hadoop JobTracker内存使用率增加v

hadoop - Kafka-Connect HDFS-Protobuf到 Parquet

scala - Apache Spark : Load file from local instead of HDFS and Loading local file giving IllegalArguementException