我工作的那个处理嵌套目录结构,包含多层次的文件作业:
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这一点。
我没有发现这一点,但任何文件*/*
作品。 因此,它是-input 'path/*/*'
。
进口org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
FileInputFormat.setInputDirRecursive(工作,真);
不,谢谢,只是叫我雷锋!
我觉得递归经历数据可能是危险的,因为有可能是从一个挥之不去的日志文件distcp
或类似的东西。 让我提出一个替代方案:
请在命令行上的递归走,然后通过在一个空格分隔参数的路径进入你的MapReduce程序。 抓斗从列表中argv
:
$ hadoop jar blah.jar "`hadoop fs -lsr recursivepath | awk '{print $8}' | grep '/data.*\.txt' | tr '\n' ' '`"
很抱歉的长期庆典,但它能够完成任务。 你可以换东西在bash脚本来打破东西伸到变量。
我个人比较喜欢的传递中,文件路径的方法来写我的MapReduce作业,使代码本身没有硬编码的路径,它是相对容易的,我将它设置为对文件的更复杂的列表运行。
不知道是不是仍然相关,但至少在Hadoop中2.4.0可以属性mapreduce.input.fileinputformat.input.dir.recursive设置为true,它会解决你的问题。
只需使用FileInputFormat.addInputPath(“与文件模式”); 我写我的第一个Hadoop的PROG键,其中输入是来自DIFF目录中的.gz格式的图形分析...它为我工作!