2015-02-19 3 views
0

Я разрабатываю приложение для сокращения карты, в котором я должен получить месяц начала и окончания месяца (не обязательно первая или последняя дата месяца, поскольку они могут быть праздниками или суббота-воскресенье) Поэтому я извлекаю месяц как ключ и соответствующую дату в качестве значения, чтобы он стал агрегированным месяцем, и я могу извлечь максимальную дату и дату. Теперь, основываясь на этой дате, мне нужно использовать другие атрибуты файла. Поэтому я хочу направить вывод одного редуктора в другой преобразователь. Этот второй сопоставитель также будет иметь файл в качестве входных данных, и поэтому я могу сравнить даты и обработать данные соответствующим образом. Есть ли способ, которым я могу это сделать?использование выходного сигнала редуктора в другом преобразователе

+0

Вы хотите, чтобы 1) использовала задание MR, чтобы извлечь минимальные/максимальные даты каждого месяца, а затем 2) запустить задание MR по тем же входным данным, но иметь доступ к этим минимальным/максимальным датам обрабатывать данные? –

+0

да. точно ... –

ответ

1

на высоком уровне один способ приблизиться к этому было бы реализовать два MapReduce рабочих мест, которые вы запускаете один за другим:

Работа 1 принимает набор входных данных и выходных пар ключ-значение для начала и конца даты каждого месяца в один файл с использованием одного редуктора. Этот выходной файл будет очень маленьким. Это может быть выполнено аналогично:

hadoop jar yourjob.jar YourFirstDriverClass /path/to/input /path/to/kvp/output 

Работа 2 имеет тот же набор входных данных, а также путь к файлу даты месяца, и выводит результат вашей обработки. Файл дат месяца достаточно мал, чтобы его можно было открыть и загрузить в память в вызове setup() каждого картографа или редуктора. Это может быть выполнено аналогично:

hadoop jar yourjob.jar YourSecondDriverClass /path/to/input /path/to/kvp/output /path/to/final/output 

В драйвере main() можно передать ссылку на даты месяца подать в картограф и восстановители аналогичен:

getConf().set('month.dates.file', args[1]); 

В вашем картографе или редукторе setup() вас можно затем загрузить данные из даты месяца файла аналогична:

Configuration conf = context.getConfiguration(); 
Path path = new Path(conf.get('month.dates.file')); 
FileSystem fs = FileSystem.get(conf); 
BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path))); 
String line = br.readLine(); 
while (line != null) { 
    // Read your month dates from line into a data structure, e.g. a Map 
    line = br.readLine(); 
} 

с месяцем датой загруженным в структуру данных в т он отображает или уменьшает класс, после чего вы можете получить к ним доступ для каждого вызова map() или reduce() и обработать свои входные данные соответствующим образом.

Это, очевидно, достаточно сложное для того, что вы пытаетесь сделать, и это хороший пример того, почему MapReduce абстракция, такими как Apache Hive, Apache Pig и Apache Crunch популярна для реализации рабочих мест с гораздо меньшим количеством коды.

+1

Спасибо человеку. Подумав больше, я узнал, что мог бы достичь этого, используя статическую переменную –

Смежные вопросы