使用FileInputFormat.addInputPaths以递归方式添加HDFS路径

时间:2011-11-13 20:41:08

标签: java hadoop hdfs

我有一个类似

的HDFS结构
a/b/file1.gz
a/b/file2.gz
a/c/file3.gz
a/c/file4.gz

我正在使用

的经典模式
FileInputFormat.addInputPaths(conf, args[0]);

设置java map reduce作业的输入路径。

如果我将 args [0] 指定为 a / b ,这样可以正常工作但如果我只指定了 a 它会失败(我的意图是处理所有4个文件)

错误

Exception in thread "main" java.io.IOException: Not a file: hdfs://host:9000/user/hadoop/a

如何递归添加 a 下的所有内容?

我一定错过了一些简单的事情......

2 个答案:

答案 0 :(得分:5)

正如Eitan Illuz提到的here,在Hadoop 2.4.0中引入了mapreduce.input.fileinputformat.input.dir.recursive配置属性,当设置为true时,指示输入格式递归地包含文件。 / p>

在Java代码中,它看起来像这样:

Configuration conf = new Configuration();
conf.setBoolean("mapreduce.input.fileinputformat.input.dir.recursive", true);
Job job = Job.getInstance(conf);
// etc.

我一直在使用这个新属性并发现它运作良好。

编辑:更好的是,在FileInputFormat上使用这种新方法可以获得相同的结果:

Job job = Job.getInstance();
FileInputFormat.setInputDirRecursive(job, true);

答案 1 :(得分:2)

这是当前版本的Hadoop中的一个错误。这是同一个JIRA。它仍处于开放状态。在代码中进行更改并构建二进制文件或等待在即将发布的版本中修复它。递归处理文件可以打开/关闭,检查附加到JIRA的补丁以获取更多详细信息。