ограничить количество записей, создаваемых всеми редьюсерами вместе

Вот вариант использования:

входные URL-адреса считываются картами, а затем отправляются после некоторой фильтрации. Затем разделители разбивают их на основе их имени хоста.

У меня есть глобальное ограничение на выходные URL-адреса после запуска задания уменьшения карты. Я распределяю это равномерно по всем редукторам. т.е. если глобальный предел равен 1000, а количество редукторов равно 5, то каждый редуктор будет выдавать не более (1000/5 = 200) URL-адресов в качестве вывода.

Проблема в том, что если есть URL-адреса только с 2 хостов (из-за пользовательского ввода) и существует 100000 URL-адресов каждого из этих 2 хостов, 2 редуктора, обрабатывающие эти URL-адреса (один и тот же хост, один и тот же раздел), ограничат только 200 URL-адресов каждый для выход. Остальные редукторы не получают никаких данных для обработки из-за секционирования и выдают 0 записей.

Таким образом, несмотря на то, что у меня было 100000 URL-адресов на хост и глобальное ограничение в 1000, на выходе было только 400 URL-адресов (200 URL-адресов на хост).


person Tejas Patil    schedule 05.04.2012    source источник


Ответы (2)


Если вам не нужно разбивать по имени хоста, вы можете решить свою проблему с помощью случайного разбиения.

Если вам нужно разделить по имени хоста, я не думаю, что есть простые ответы. Каждый редьюсер не знает, сколько записей поступает. Каждый редьюсер должен накопить 100000 записей или столько, сколько он получит. Вам нужно переопределить функцию очистки в вашем редукторе. Редукторы должны общаться друг с другом (возможно, через счетчик) в функции «очистки» и решать, сколько записей необходимо, и только записывать записи в функции очистки.

что ты думаешь?

person root1982    schedule 05.04.2012
comment
Мне нужно разделить по имени хоста, поскольку URL-адреса с одного хоста группируются вместе и упрощают дальнейшую логику. Является ли функция очистки частью потока Hadoop map-reduce или предлагаемого вами механизма? Пожалуйста, подробнее об этом. - person Tejas Patil; 05.04.2012
comment
вы можете перезаписать эту функцию в своем классе редуктора. В вашей функции сокращения вы должны просто хранить записи в контейнере, а не записывать их. В функции очистки вы можете установить связь и решить, сколько записей нужно записать текущему преобразователю. Найдите функцию очистки на следующей странице: hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/ - person root1982; 08.04.2012

В Hadoop встроена поддержка глобальных счетчиков. Вы можете определить свои собственные счетчики и увеличивать/считывать их из кода преобразователя или редуктора.

person jdhok    schedule 05.04.2012
comment
Благодарю. Я попробую использовать счетчики. Я думаю, что поддержка счетчиков (в некотором роде общая переменная) повлияет на производительность для больших входных данных, но на данный момент у меня нет выбора. - person Tejas Patil; 05.04.2012