gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:20:05 25 4
gpt4 key购买 nike

我想将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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com