-->

Hadoop的MapReduce的提供嵌套的目录,输入工作(Hadoop MapReduce pro

2019-07-29 01:47发布

我工作的那个处理嵌套目录结构,包含多层次的文件作业:

one/
├── three/
│   └── four/
│       ├── baz.txt
│       ├── bleh.txt
│       └── foo.txt
└── two/
    ├── bar.txt
    └── gaa.txt

当添加one/作为输入路径,没有文件被处理时,因为没有一个是立即可用在根级别。

我读到job.addInputPathRecursively(..)但是这似乎已经在最近的版本(我使用Hadoop 1.0.2)被弃用。 我已经写了一些代码,走路的文件夹,并添加每个目录job.addInputPath(dir)其工作,直到工作当试图处理目录由于某种原因,输入文件,如坠毁-试图fs.open(split.getPath())split.getPath()是一个目录(这发生内部LineRecordReader.java )。

我试图说服自己,必须有一个简单的方法来提供一个嵌套的目录结构的工作。 有任何想法吗?

编辑 -显然是有一个开放的bug这一点。

Answer 1:

我没有发现这一点,但任何文件*/*作品。 因此,它是-input 'path/*/*'



Answer 2:

进口org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

FileInputFormat.setInputDirRecursive(工作,真);

不,谢谢,只是叫我雷锋!



Answer 3:

我觉得递归经历数据可能是危险的,因为有可能是从一个挥之不去的日志文件distcp或类似的东西。 让我提出一个替代方案:

请在命令行上的递归走,然后通过在一个空格分隔参数的路径进入你的MapReduce程序。 抓斗从列表中argv

$ hadoop jar blah.jar "`hadoop fs -lsr recursivepath | awk '{print $8}' | grep '/data.*\.txt' | tr '\n' ' '`"

很抱歉的长期庆典,但它能够完成任务。 你可以换东西在bash脚本来打破东西伸到变量。

我个人比较喜欢的传递中,文件路径的方法来写我的MapReduce作业,使代码本身没有硬编码的路径,它是相对容易的,我将它设置为对文件的更复杂的列表运行。



Answer 4:

不知道是不是仍然相关,但至少在Hadoop中2.4.0可以属性mapreduce.input.fileinputformat.input.dir.recursive设置为true,它会解决你的问题。



Answer 5:

只需使用FileInputFormat.addInputPath(“与文件模式”); 我写我的第一个Hadoop的PROG键,其中输入是来自DIFF目录中的.gz格式的图形分析...它为我工作!



文章来源: Hadoop MapReduce provide nested directories as job input