我有一个类似的HDFS结构
a/b/file1.gz a/b/file2.gz a/c/file3.gz a/c/file4.gz
我使用的是经典模式
FileInputFormat.addInputPaths(conf, args[0]);
设置我的Java映射减少作业的输入路径。
如果我将args [0]指定为a / b,则效果很好,但如果仅指定a(我的意图是要处理所有4个文件),它将失败
错误是
Exception in thread "main" java.io.IOException: Not a file: hdfs://host:9000/user/hadoop/a
如何将所有内容递归添加到?
我一定错过了一些简单的事情...
正如Eitan Illuz在此所述,在Hadoop 2.4.0 mapreduce.input.fileinputformat.input.dir.recursive
中引入了一个配置属性,当该属性设置为true
指示输入格式以递归方式包含文件时。
在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);