我有一个类似的HDFS结构
a/b/file1.gz
a/b/file2.gz
a/c/file3.gz
a/c/file4.gz
Run Code Online (Sandbox Code Playgroud)
我使用的是经典模式
FileInputFormat.addInputPaths(conf, args[0]);
Run Code Online (Sandbox Code Playgroud)
设置我的Java映射减少作业的输入路径。
如果我将args [0]指定为a / b,则效果很好,但如果仅指定a(我的意图是要处理所有4个文件),它将失败
错误是
Exception in thread "main" java.io.IOException: Not a file: hdfs://host:9000/user/hadoop/a
Run Code Online (Sandbox Code Playgroud)
如何将所有内容递归添加到?
我一定错过了一些简单的事情...
正如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.
Run Code Online (Sandbox Code Playgroud)
我一直在使用此新属性,并发现它运行良好。
编辑:更好的是,使用此新方法FileInputFormat可以达到相同的结果:
Job job = Job.getInstance();
FileInputFormat.setInputDirRecursive(job, true);
Run Code Online (Sandbox Code Playgroud)