Ответ 1
Я не нашел никаких документов, но */*
работает. Итак, -input 'path/*/*'
.
Я работаю над заданием, которое обрабатывает вложенную структуру каталогов, содержащую файлы на нескольких уровнях:
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
).
Я пытаюсь убедить себя, что должен быть более простой способ предоставить работу вложенной структуре каталогов. Любые идеи?
РЕДАКТИРОВАТЬ - видимо, есть открытая ошибка.
Я не нашел никаких документов, но */*
работает. Итак, -input 'path/*/*'
.
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
FileInputFormat.setInputDirRecursive(job, true);
Нет, спасибо, просто позвоните мне LeiFeng!
Я нахожу, что рекурсивно перемещение данных может быть опасным, поскольку могут существовать затяжные файлы журналов с 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, поэтому сам код не имеет жестко заданных путей, и мне относительно легко настроить его для работы с более сложным списком файлов.
Не знаю, насколько актуально, но по крайней мере в hadoop 2.4.0 вы можете установить свойство mapreduce.input.fileinputformat.input.dir.recursive на true и он решит вашу проблему.
просто используйте FileInputFormat.addInputPath( "с шаблоном файла" ); Я пишу свой первый профайл proo для анализа графа, где ввод данных происходит из diff dir в формате .gz... это сработало для меня!