我已在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)
答案 0 :(得分:0)
该文件类似于顺序文件,因为它包含以序列化形式保存的键值对,但它被设计为快速扫描以进行排序和分区,并且具有仅内部格式。
如果您确实需要查看映射器生成的键值对的集合,那么请查看配置reducer以使用MultipleOutputs类 - 一个输出将包含reducer读入的每个键/值对,另一个输出包含减速机的“实际”输出。