Подтвердить что ты не робот

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

Я пытаюсь убедить себя, что должен быть более простой способ предоставить работу вложенной структуре каталогов. Любые идеи?

РЕДАКТИРОВАТЬ - видимо, есть открытая ошибка.

4b9b3361

Ответ 1

Я не нашел никаких документов, но */* работает. Итак, -input 'path/*/*'.

Ответ 2

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

FileInputFormat.setInputDirRecursive(job, true);

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

Ответ 3

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

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

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

Извините за длинный bash, но он выполняет свою работу. Вы можете обернуть предмет в bash script, чтобы разбить все на переменные.

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

Ответ 4

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

Ответ 5

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