Отправка данных со всех мапперов на все редукторы

Прежде чем этот вопрос будет помечен как дубликат, прочтите его.

Этот вопрос задавался много раз без четкого ответа. Допустим, моя задача — вычислить вероятность unigram для каждого слова в миллионах файлов. Я могу выдавать счетчики слов из картографов, а редукторы могут агрегировать счетчики для каждого слова. Однако для вычисления вероятностей нам нужно общее количество слов. Один из способов сделать это — отправить количество слов от каждого преобразователя каждому редюсеру со специальным ключом и отсортировать ключи таким образом, чтобы эти подсчеты поступали раньше, чем отдельные подсчеты. Затем редуктор может просто сложить количество, полученное от картографов, чтобы получить общее количество слов.

Но как заставить мапперы отправлять счетчики всем редукторам?

Я могу узнать общее количество редукторов из свойств задания, скажем, n. Нет ли способа вызывать Context.write() n количество раз из каждого маппера и указывать номер раздела от 0 до n-1 по очереди, чтобы данные доходили до всех редукторов?


person abhinavkulkarni    schedule 10.10.2013    source источник
comment
@cabad: есть аргументы против использования счетчиков. Предполагается, что счетчики предназначены для агрегирования статистики на уровне работы. Кроме того, в новом API счетчики доступны только для записи. См. ответ Роберта Эванса, коммиттера Hadoop, здесь: mail-archives.apache.org/mod_mbox/hadoop-mapreduce-user/   -  person abhinavkulkarni    schedule 11.10.2013


Ответы (1)


Для этой цели вы можете использовать пользовательский Partitioner.

Учитывая количество редюсеров n, вы можете выдать количество слов n раз с помощью клавиш 1, 2, ... n в вашем маппере. Пользовательский класс Partitioner гарантирует, что редюсер i получит только значения с ключом i.

person harpun    schedule 10.10.2013
comment
Разве все редукторы не будут генерировать одинаковое совокупное количество? - person cabad; 11.10.2013
comment
@cabad ОП попросил способ передать значения всем редукторам из одного преобразователя. Обеспечение того, чтобы это соответствовало потребностям ОП, является его задачей. На мой взгляд, в вопросе четко не указано, какая проблема на самом деле решается. - person harpun; 11.10.2013
comment
Я понимаю вашу точку зрения, однако другие люди могут прочитать эти ответы в будущем и могут не заметить, что наличие 100 редукторов дает один и тот же ответ (сумма равна X!), Это не очень хорошая идея. По крайней мере, они могут прочитать комментарии и понять, действительно ли это то, чего они хотят. - person cabad; 11.10.2013
comment
@harpun: я лучше сформулировал вопрос. Надеюсь, теперь сценарий ясен. Думаю, ваша стратегия сработает. - person abhinavkulkarni; 11.10.2013