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

mat*_*cey 2 java hadoop hdfs

我有一个类似的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)

如何将所有内容递归添加

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

Jos*_*sen 5

正如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)