я работаю на работе, которая обрабатывает вложенную структуру каталогов, содержащие файлы на нескольких уровнях:Hadoop MapReduce обеспечивает вложенные каталоги в качестве входных данных задания
one/
├── three/
│ └── four/
│ ├── baz.txt
│ ├── bleh.txt
│ └── foo.txt
└── two/
├── bar.txt
└── gaa.txt
Когда я добавляю one/
в качестве входного пути, никаких файлов не являются обрабатывается, так как ни один из них не доступен сразу на корневом уровне.
Я читал около job.addInputPathRecursively(..)
, но это, кажется, устарело в последних выпусках (я использую hasoop 1.0.2). Я написал некоторый код, чтобы ходить по папкам и добавлять каждый каталог с job.addInputPath(dir)
, который работал до тех пор, пока работа не сработала при попытке обработать каталог как входной файл по какой-либо причине, например. - пытается установить fs.open(split.getPath())
, когда split.getPath()
- это каталог (это происходит внутри LineRecordReader.java
).
Я пытаюсь убедить себя, что должен быть более простой способ обеспечить работу вложенной структурой каталогов. Есть идеи?
EDIT - видимо, есть open bug.
Не так ли использовать 'FileSystem # listStatus()' и добавить их рекурсивно? –
Я решаю его подобным образом - написал рекурсивный код, который пересекает подкаталоги и добавляет все файлы для ввода Paths –
@ThomasJungblut, это в основном мой текущий подход. Мне просто кажется странным, что эта функциональность не встроена.Другая проблема, с которой я столкнулась, заключается в том, что хаоп падает, когда он обращается к подпапке без каких-либо файлов в ней, а также к другим папкам (например, «один» и «один/три» в моем примере). Поэтому в основном мне нужно реализовать логику, которая будет рекурсивно добавлять папки, если они ** только ** имеют в них другие папки, а не файлы (все равно придется перемещать свой контент для добавления вложенных файлов). Кажется, много проблем только для того, чтобы создать работу. – sa125