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

У меня есть структура 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?

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


person mat kelcey    schedule 13.11.2011    source источник


Ответы (2)


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

person Praveen Sripati    schedule 14.11.2011

Как упоминал Эйтан Иллуз, здесь, в 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.

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

EDIT: Еще лучше использовать этот новый метод для FileInputFormat, который дает тот же результат:

Job job = Job.getInstance();
FileInputFormat.setInputDirRecursive(job, true);
person Josh Hansen    schedule 16.12.2014
comment
conf.setBoolean(mapreduce.input.fileinputformat.input.dir.recursive, true); у меня тоже работало в Hadoop 2.2.0 - person Alex; 07.07.2016