Hadoop одна Карта и несколько Уменьшают

У нас есть большой набор данных для анализа с несколькими, уменьшают функции.

Все уменьшают работу алгоритма над тем же набором данных, сгенерированным той же функцией карты. Чтение большого набора данных стоит слишком много, чтобы сделать это каждый раз, когда это было бы лучше к только для чтения однажды и передало бы отображенные данные нескольким, уменьшают функции.

Я могу сделать это с Hadoop? Я искал примеры и интрасеть, но я не мог найти решения.

36
задан gsamaras 6 February 2016 в 22:16
поделиться

4 ответа

Вы ожидаете, что каждый reducer будет работать с точно такими же сопоставленными данными? Но, по крайней мере, "ключ" должен быть разным, поскольку он решает, к какому редуктору идти.

Вы можете написать вывод для нескольких раз в mapper, и выводить как ключ (где $i - для i-го редуктора, а $key - ваш исходный ключ). И вам нужно добавить "Partitioner", чтобы убедиться, что эти n записей распределены по редукторам, основываясь на $i. Затем с помощью "GroupingComparator" сгруппировать записи по исходному $key.

Это возможно сделать, но не тривиальным способом в одном MR.

4
ответ дан 27 November 2019 в 06:18
поделиться

Может быть, простым решением было бы написать задание, в котором нет сокращения функция. Таким образом, вы должны передать все сопоставленные данные непосредственно в вывод задания. Вы просто устанавливаете количество редукторов на ноль для работы.

Затем вы должны написать задание для каждой отдельной функции сокращения, которая работает с этими данными. Однако это будет означать сохранение всех отображаемых данных в HDFS.

Другой альтернативой может быть объединение всех ваших функций reduce в один Reducer, который выводит в несколько файлов, используя разные выходные данные для каждой отдельной функции. Несколько выходов упоминаются в этой статье для hadoop 0.19 . Я почти уверен, что эта функция не работает в новом API-интерфейсе mapreduce, выпущенном с 0.20.1, но вы все равно можете использовать его в более старом API-интерфейсе mapred.

11
ответ дан 27 November 2019 в 06:18
поделиться

Конечно, вы можете определить несколько редукторов. Для Job (Hadoop 0.20) просто добавьте:

job.setNumReduceTasks(<number>);

Но. Ваша инфраструктура должна поддерживать несколько редукторов, что означает, что у вас должно быть

  1. более одного доступного процессора
  2. настройте mapred.tasktracker.reduce.tasks.maximum в mapred-site.xml соответствующим образом

И, конечно, ваша работа должна соответствовать некоторым спецификациям. Не зная, что именно вы хотите сделать, я могу дать только общие рекомендации:

  • ключmap-output должен быть либо разделяемым на %numreducers, либо вы должны определить свой собственный разделитель: job.setPartitionerClass(...) например, с помощью random-partitioner ...
  • данные должны быть пригодны для сокращения в формате разбиения ... (нужны ссылки?)

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

Взгляните также на класс Combiner, который является локальным редуктором. Это означает, что вы можете агрегировать (уменьшать) уже в памяти частичные данные, выдаваемые map. Очень хороший пример - WordCount-Example. Карта выдает каждое слово как ключ и его количество как 1: (слово, 1). Комбинатор получает частичные данные из карты и локально выдает (, ). Редуктор делает то же самое, но теперь некоторые (объединенные) количества слов уже >1. Экономия времени.

0
ответ дан 27 November 2019 в 06:18
поделиться

Я все еще не понимаю вашей проблемы, вы можете использовать следующую последовательность:

database-->map-->reduce (используйте cat или None в зависимости от требований) затем сохраните извлеченное представление данных. Если вы говорите, что оно достаточно мало, чтобы поместиться в памяти, то хранение его на диске не должно быть проблемой.

Также ваше использование парадигмы MapReduce для данной задачи неверно, использование одной функции map и нескольких "разных" функций reduce не имеет смысла, это показывает, что вы просто используете map для передачи данных на разные машины для выполнения различных действий. Для этого не требуется hadoop или любая другая специальная архитектура.

0
ответ дан 27 November 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: