我有一个类似
的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 下的所有内容?
我一定错过了一些简单的事情......
答案 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的补丁以获取更多详细信息。