我在hadoop中尝试以下内容:
我在“public void configure(JobConf conf)”上使用了这段代码:
String uri = "out/foo";
FileSystem fs = FileSystem.get(URI.create(uri), conf);
FileStatus[] status = fs.listStatus(new Path(uri));
for (int i=0; i<status.length; ++i) {
Path currFile = status[i].getPath();
System.out.println("status: " + i + " " + currFile.toString());
try {
SequenceFile.Reader reader = null;
reader = new SequenceFile.Reader(fs, currFile, conf);
IntWritable key = (IntWritable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
IntWritable value = (IntWritable ) ReflectionUtils.newInstance(reader.getValueClass(), conf);
while (reader.next(key, value)) {
// do the code for all the pairs.
}
}
}
代码在一台机器上运行良好,但我不确定它是否会在集群上运行。 换句话说,此代码是从当前计算机读取文件还是从分布式系统读取ID?
对于我正在尝试做的事情,是否有更好的解决方案?
提前致谢,
阿里克。
答案 0 :(得分:0)
FileSystem.get()的URI没有定义方案,因此使用的文件系统取决于配置参数fs.defaultFS。如果没有设置,将使用默认设置,即LocalFile系统。
您的程序写入workingDir / out / foo下的本地文件系统。它也应该在集群中工作,但查找本地文件系统。
如上所述,我不确定为什么你需要来自foo目录的整个文件。您可能已经考虑过其他设计。如果需要,首先应将这些文件复制到HDFS,然后从reducer的重写设置方法中读取文件。不用说,关闭在你的减速机的重写特写方法中打开的文件。虽然可以在reducer中读取文件,但map / reduce程序并不是为这种功能而设计的。