2016-05-14 4 views
5

В моем файле ввода при создании Jar для моего задания MapReduce я использую команду Hadoop-local. Я хотел знать, был ли способ, а не конкретно указывать путь для каждого файла в моей папке ввода, который будет использоваться в задании MapReduce, могу ли я просто указать и передать все файлы из моей папки ввода. Это связано с тем, что содержимое и количество файлов могут измениться из-за характера заданий MapReduce, которые я пытаюсь настроить, и поскольку я не знаю конкретного количества файлов, кроме только содержимого этих файлов, есть способ передать все файлы из входной папки в мою программу MapReduce, а затем перебрать каждый файл, чтобы вычислить определенную функцию, которая затем отправит результаты в редуктор. Я использую только одну программу Map/Reduce, и я кодирую на Java. Я могу использовать команду hadoop-moonshot, но сейчас я работаю с хаосом-локальным.Hadoop, MapReduce - несколько путей ввода/вывода

Спасибо.

+0

Если указать каталог HDFS в работе вместо файла, то все файлы должны быть прочитаны. Не могли бы вы [изменить] ваш вопрос включить команду, которую вы используете? Может быть, какой-то код в [mcve], также? –

+0

Спасибо @ cricket_007, возможно, вы могли бы привести пример вызова в каталог HDFS, а не один файл. Кроме того, как у меня будет отдельный выходной файл для каждого входа. Я предполагаю, что это с использованием класса MultipleOutput каким-то образом, но я не вижу, как на данный момент. –

+0

Я не могу вспомнить, как выводить несколько файлов, но сам вывод mapreduce должен быть в одном каталоге. Что касается ввода справочника, то в примере [пример номера слова] (https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Usage) читаются два файла из одного directory –

ответ

1

Вам не нужно передавать отдельные файлы в качестве входных данных для MapReduce Работа.

FileInputFormat класс уже предоставляет API для приема списка нескольких файлов в качестве ввода в карту. Сокращение программы.

public static void setInputPaths(Job job, 
       Path... inputPaths) 
          throws IOException 

Добавить путь в список входов для работы на карте-свертка. Параметры:

конф - Конфигурация задания

путь - Путь будет добавлен в список входов для работы на карте-свертка.

Пример кода от Apache tutorial

Job job = Job.getInstance(conf, "word count"); 
FileInputFormat.addInputPath(job, new Path(args[0])); 

MultipleInputs обеспечивает ниже API.

public static void addInputPath(Job job, 
       Path path, 
       Class<? extends InputFormat> inputFormatClass, 
       Class<? extends Mapper> mapperClass) 

Добавить путь с пользовательским InputFormat и Mapper в список входов для работы на карте-свертка.

Связанные SE вопрос:

Can hadoop take input from multiple directories and files

Обратитесь к MultipleOutputs API относительно вашего второго запроса на несколько путей выхода.

FileOutputFormat.setOutputPath(job, outDir); 

// Defines additional single text based output 'text' for the job 
MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, 
LongWritable.class, Text.class); 

// Defines additional sequence-file based output 'sequence' for the job 
MultipleOutputs.addNamedOutput(job, "seq", 
SequenceFileOutputFormat.class, 
LongWritable.class, Text.class); 

Посмотрите на связанные вопросы SE относительно нескольких выходных файлов.

Writing to multiple folders in hadoop?

hadoop method to send output to multiple directories

+0

В этом примере кода, который вы вытащили, используется только один входной путь. –

+0

За исключением заголовка вопроса, в котором говорится, что оба входа/выхода, OP ищет несколько файлов в качестве ввода в тело вопроса. Нет упоминания о выходе. Позже я добавил setOutputPath API. –

+0

Название и вопрос на самом деле не совпадают. Все, что было задано, было чтение каталога файлов. Который, да, этот код может сделать. Я просто сказал, что вы упоминаете несколько путей, но пример кода не использует этот метод –