我想将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类中处理?
答案 0 :(得分:1)
让我们来看看这个问题的根源。每个map或reduce任务都在其自己的Java虚拟机(JVM)中启动。这些JVM不会彼此共享内存。
假设您有以下设置:
这就是:
Main.map<K,V>
Main.map<K,V>
读取,但没有任何内容,因为 jvm-2 在自己的内存中写入 jvm -1 将无法看到。类似的事情发生在System.out
。它实际上可能不会附加到stdout
流。可能(如果您有多节点设置),输出将转到网络上的另一台机器。