如何读取Hadoop映射中间文件file.out

如何读取Hadoop映射中间文件file.out,hadoop,mapreduce,mapper,Hadoop,Mapreduce,Mapper,我已在mapred-site.xml中将属性keep.task.files.pattern设置为“*” 重新启动群集并执行我的测试mapreduce程序 我在文件夹中看到两个file.out和file.out.index /opt/hadoopws/tmp/mapred/local/taskTracker/hduser/jobcache/job\u 201403260903\u 0001/trust\u 201403260903\u 0001\u m\u000000\u 0/output/ 当我

我已在mapred-site.xml中将属性
keep.task.files.pattern
设置为
“*”

重新启动群集并执行我的测试mapreduce程序

我在文件夹中看到两个file.out和file.out.index
/opt/hadoopws/tmp/mapred/local/taskTracker/hduser/jobcache/job\u 201403260903\u 0001/trust\u 201403260903\u 0001\u m\u000000\u 0/output/

当我尝试使用下面的代码读取file.out时,我会收到
“非SequenceFile错误”
消息。 我确信当我尝试打开file.out时,它是一个二进制文件。用更少的文件,它会提示这是一个二进制文件。 我正在运行Hadoop 1.2.1。默认地图输出格式是什么

FileSystem fs = FileSystem.get(conf);
Path path = new Path("/opt/hadoopws/tmp/mapred/local/taskTracker/hduser/jobcache
             /job_201403260903_0001/attempt_201403260903_0001_m_000000_0/output
             /file.out");
SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
IntWritable key = new IntWritable();
IntWritable value = new IntWritable();
while (reader.next(key, value)) {
        System.out.println(key.get() + " | " + value.get());
    }
reader.close();

错误消息:

Exception in thread "main" java.io.IOException: /opt/hadoopws/tmp/mapred/local/taskTracker/hduser/jobcache/job_201403260903_0001/attempt_201403260903_0001_m_000000_0/output/file.out not a SequenceFile
at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1517)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1490)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1479)
at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1474)
at HDPConfigRun.run(HDPConfigRun.java:31)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at HDPConfigRun.main(HDPConfigRun.java:45)
线程“main”java.io.IOException中的异常:/opt/hadoopws/tmp/mapred/local/taskTracker/hduser/jobcache/job\u 201403260903\u 0001/trust\u 201403260903\u 0001\u m\u 000000\u 0/output/file.out不是序列文件
位于org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1517)
位于org.apache.hadoop.io.SequenceFile$Reader。(SequenceFile.java:1490)
位于org.apache.hadoop.io.SequenceFile$Reader。(SequenceFile.java:1479)
位于org.apache.hadoop.io.SequenceFile$Reader。(SequenceFile.java:1474)
在HDPConfigRun.run(HDPConfigRun.java:31)
位于org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
位于org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
位于HDPConfigRun.main(HDPConfigRun.java:45)

该文件类似于顺序文件,因为它包含以序列化形式保存的键值对,但它的设计目的是为了快速扫描以进行排序和分区,并且只有内部格式


如果您真的需要查看映射器生成的键值对集,那么请查看配置您的reducer以使用MultipleOutputs类-一个输出将包含reducer读入的每个键值对,另一个输出将包含reducer的“实”输出

如果我们不能读取文件,那么保存中间文件和使用keep.task.files.pattern属性有什么意义呢?我怀疑这更像是一个内部调试选项。我从来没有听说过hadoop的用例涉及到该文件的使用。