2012-04-18 9 views
21

я работаю на работе, которая обрабатывает вложенную структуру каталогов, содержащие файлы на нескольких уровнях: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.

+3

Не так ли использовать 'FileSystem # listStatus()' и добавить их рекурсивно? –

+0

Я решаю его подобным образом - написал рекурсивный код, который пересекает подкаталоги и добавляет все файлы для ввода Paths –

+1

@ThomasJungblut, это в основном мой текущий подход. Мне просто кажется странным, что эта функциональность не встроена.Другая проблема, с которой я столкнулась, заключается в том, что хаоп падает, когда он обращается к подпапке без каких-либо файлов в ней, а также к другим папкам (например, «один» и «один/три» в моем примере). Поэтому в основном мне нужно реализовать логику, которая будет рекурсивно добавлять папки, если они ** только ** имеют в них другие папки, а не файлы (все равно придется перемещать свой контент для добавления вложенных файлов). Кажется, много проблем только для того, чтобы создать работу. – sa125

ответ

4

Я нахожу, что рекурсивно просматриваемые данные могут быть опасными, поскольку могут существовать затяжные файлы журнала с distcp или что-то подобное. Позвольте мне предложить альтернативу:

Проведите рекурсивную прогулку по командной строке, а затем передайте пути в параметре с разделителями пробелов в вашу программу MapReduce. Возьмите список из argv:

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

Извините за длинный Баш, но он получает работу. Вы можете обернуть вещь в сценарий bash, чтобы разбить вещи на переменные.

Мне лично нравится подход, основанный на пропуске в файле, для написания моих заданий mapreduce, поэтому сам код не имеет жестко заданных путей, и мне относительно легко настроить его для работы с более сложным списком файлов.

+0

Спасибо за это. Знаете ли вы, есть ли какие-либо причины сделать это таким образом против FileInputFormat.addInputPaths («разделенный запятой файл из вышеупомянутого bash»)? – dranxo

+0

Интересно, почему? Я новичок в Hadoop, но уже столкнулся с этой проблемой. – dranxo

-1

просто используйте FileInputFormat.addInputPath («с шаблоном файла»); Я пишу свой первый проспект prog для анализа графа, где вход от diff dir в формате .gz ... это сработало для меня !!!

+0

с использованием шаблона имени является одним из способов избежать проблемы с вложенными каталогами. – hakunami

14

Я не нашёл никакого документа по этому вопросу, но */* работ. Так что это -input 'path/*/*'.

+0

Уверен, что это не расширяется в bash (или вашей оболочке) и запускает тонны экземпляров hadoop? – jbu

+0

У меня одинарные кавычки вокруг них. – Cheng

+0

Запуск 'ps -aux' поможет устранить проблему, упомянутую @jbu –

1

Не знаю, по-прежнему актуальна, но, по крайней мере в Hadoop 2.4.0 можно установить свойство mapreduce.input.fileinputformat.input.dir.recursive к истинной и это решит вашу проблему.

6

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

FileInputFormat.setInputDirRecursive (job, true);

Нет, спасибо, просто позвоните мне LeiFeng!

+0

haha ​​Hello LeiFeng, мне понравилось читать ур дневник :) – songyy