Java Hadoop将输出写入普通文件
我想将Reducer结果写入普通文件(例如.csv或.log文件),而不是写入HDFS。因此,我在reducer类中使用以下代码: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
@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)
Main.map
Main.map
读取,但是没有任何内容,因为jvm-2在自己的内存中写入了一个jvm-1看不到的映射类似的事情也发生了
System.out
。它实际上可能不会附加到stdout
流。很可能(如果您有多节点设置),输出将发送到网络上的另一台机器 你到底想通过这个实现什么?例如,我运行word count,hadoop jar word count.jar输入输出,除了将输出写入HDFS之外,我还想将结果写入一个日志文件,比如result.log,这个result.log与HDFSok中的输出文件完全相同……如果是这样,我该怎么办?如何将结果打印到文件中?