如何阅读Hadoop Map中间文件file.out

时间:2014-03-26 15:57:57

标签: 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_201403260903_0001/attempt_201403260903_0001_m_000000_0/output/

当我尝试使用以下代码读取file.out时,我收到"not a SequenceFile error"消息。 当我尝试用较少的文件打开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)

1 个答案:

答案 0 :(得分:0)

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

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