Использование FileInputFormat.addInputPaths для рекурсивного добавления пути HDFS - PullRequest
2 голосов
/ 14 ноября 2011

У меня есть структура HDFS что-то вроде

a/b/file1.gz
a/b/file2.gz
a/c/file3.gz
a/c/file4.gz

Я использую классический шаблон

FileInputFormat.addInputPaths(conf, args[0]);

, чтобы установить мой путь ввода для задания сокращения Java-карты.

Это прекрасно работает, если я укажу args [0] как a / b , но произойдет сбой, если я укажу только a (мое намерениеобработать все 4 файла)

ошибка

Exception in thread "main" java.io.IOException: Not a file: hdfs://host:9000/user/hadoop/a

Как мне рекурсивно добавить все в a ?

Я должен что-то упуститьпросто ...

Ответы [ 2 ]

5 голосов
/ 17 декабря 2014

Как Eitan Illuz упомянул здесь , в Hadoop 2.4.0 было введено свойство конфигурации mapreduce.input.fileinputformat.input.dir.recursive, которое при значении true инструктирует формат ввода включать файлы рекурсивно.

В коде Java это выглядит так:

Configuration conf = new Configuration();
conf.setBoolean("mapreduce.input.fileinputformat.input.dir.recursive", true);
Job job = Job.getInstance(conf);
// etc.

Я использовал это новое свойство и обнаружил, что оно работает хорошо.

РЕДАКТИРОВАТЬ: Еще лучше, используйте этот новый метод на FileInputFormat, который достигает того же результата:

Job job = Job.getInstance();
FileInputFormat.setInputDirRecursive(job, true);
2 голосов
/ 14 ноября 2011

Это ошибка в текущей версии Hadoop. Вот JIRA для того же. Это все еще в открытом состоянии. Либо внесите изменения в код и создайте двоичные файлы, либо дождитесь исправления в следующих выпусках. Обработка файлов рекурсивно может быть включена / выключена, проверьте патч, прикрепленный к JIRA, для более подробной информации.

...