2012-04-05 2 views
1

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

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

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

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

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

ответ

1

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

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

Что вы думаете?

+0

Мне нужно разделить по имени хоста, поскольку URL-адреса одного и того же хоста группируются вместе и упрощают дальнейшую логику. Является ли функция очистки некоторой частью потока с уменьшением карты хауопа или вашего предлагаемого механизма? Расскажите подробнее об этом. –

+0

вы можете перезаписать эту функцию в своем классе редуктора. В вашей функции сокращения вы должны просто хранить записи в контейнере, а не записывать их. В функции очистки вы можете выполнить связь и решить, сколько записей должен записывать текущий редуктор. Найдите функцию очистки по следующей странице: http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/mapreduce/Mapper.html – root1982

1

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

+0

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

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