22

我正在从事一项处理嵌套目录结构的工作,其中包含多个级别的文件:

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) .

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

编辑- 显然有一个开放的错误

4

5 回答 5

14

我没有找到任何关于此的文件,但*/*有效。所以它是-input 'path/*/*'

于 2012-08-13T06:57:02.163 回答
7

导入 org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

FileInputFormat.setInputDirRecursive(job, true);

不用了,就叫我雷锋吧!

于 2014-12-31T03:43:02.820 回答
4

我发现递归浏览数据可能很危险,因为可能存在来自 adistcp或类似文件的挥之不去的日志文件。让我提出一个替代方案:

在命令行上执行递归遍历,然后将路径以空格分隔的参数传递到 MapReduce 程序中。从以下位置获取列表argv

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

对不起,很长一段时间,但它完成了工作。您可以将事物包装在 bash 脚本中,以将事物分解为变量。

我个人喜欢使用传入文件路径的方法来编写我的 mapreduce 作业,因此代码本身没有硬编码的路径,而且我可以相对容易地将其设置为针对更复杂的文件列表运行。

于 2012-04-18T17:31:57.543 回答
2

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

于 2014-12-04T12:46:40.073 回答
-1

只需使用 FileInputFormat.addInputPath("with file pattern"); 我正在编写我的第一个用于图形分析的 hadoop prog,其中输入来自 .gz 格式的 diff dir ...它对我有用!!!

于 2012-04-27T21:49:48.237 回答