Рекурсивная карта Hadoop - PullRequest
       3

Рекурсивная карта Hadoop

2 голосов
/ 10 февраля 2011

У меня есть требование, чтобы мой маппер мог в некоторых случаях создать новый ключ / значение для другого маппера для обработки.Есть ли вменяемый способ сделать это?Я думал написать свой собственный формат ввода (очередь?) Для достижения этой цели.Есть идеи?Спасибо!

РЕДАКТИРОВАТЬ: я должен уточнить

Метод 1

Map Step 1
(foo1, bar1) -> out1
(foo2, bar2) -> out2
(foo3, bar3) -> (fooA, barA), (fooB, barB)
(foo4, bar4) -> (fooC, barC)

Reduction Step 1:
(out1) -> ok
(out2) -> ok
((fooA, barA), (fooB, barB)) -> create Map Step 2
((fooC, barC)) -> also send this to Map Step 2

Map Step 2:
(fooA, barA) -> out3
(fooB, barB) -> (fooD, barD)
(fooC, barC) -> out4

Reduction Step 2:
(out3) -> ok
((fooD, barD)) -> create Map Step 3
(out4) -> ok

Map Step 3:
(fooD, barD) -> out5

Reduction Step 3:
(out5) -> ok

-- no more map steps. finished --

Так что это полностью рекурсивный.Некоторые ключи / значения генерируют выходные данные для уменьшения, некоторые генерируют новый ключ / значения для отображения.Я на самом деле не знаю, сколько шагов Map или Reduction я могу встретить на данном прогоне.

Метод 2

Map Step 1
(foo1, bar1) -> out1
(foo2, bar2) -> out2
(foo3, bar3) -> (fooA, barA), (fooB, barB)
(foo4, bar4) -> (fooC, barC)
(fooA, barA) -> out3
(fooB, barB) -> (fooD, barD)
(fooC, barC) -> out4
(fooD, barD) -> out5

Reduction Step 1:
(out1) -> ok
(out2) -> ok
(out3) -> ok
(out4) -> ok
(out5) -> ok

Этот метод заставит картографироватькормить свой собственный входной список.Я не уверен, какой способ будет проще реализовать.

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

Способ "Метод 1" для выполнения рекурсии через Hadoop заставляет вас проходить полный набор данных через обе карты и уменьшать для каждой "глубины рекурсии". Это подразумевает, что вы должны быть уверены, насколько глубоко это может зайти, и вы испытаете огромное влияние на производительность.

Можете ли вы точно сказать, что глубина рекурсии ограничена?

Если это так, то я определенно выбрал бы «Метод 2» и на самом деле построил бы маппер таким образом, чтобы выполнялась необходимая рекурсия внутри одного вызова маппера. Это проще и экономит много времени.

1 голос
/ 11 февраля 2011

Насколько я понимаю, в начале работы Hadoop MR Framework планирует, какие задачи карты должны быть выполнены, и не готов к тому, чтобы новые задачи карты отображались динамически.
Я бы предложил два возможных решения: а) если вы излучаете другие пары во время фазы карты - подайте их в тот же картограф. Таким образом, mapper будет принимать свои обычные аргументы и после обработки будет искать какую-то внутреннюю локальную очередь для обработки дополнительных пар. Это будет хорошо работать, если есть небольшие наборы вторичных пар, а локальность данных не так важна.
б) Если вы действительно обрабатываете каталоги или что-то подобное - вы можете перебрать структуру в основной части пакета заданий и сразу же создать все необходимые разбиения.

1 голос
/ 10 февраля 2011

Используйте oozie [язык определения рабочего процесса сетки], чтобы связать воедино два задания M / R, причем первое из них имеет только маппер.http://yahoo.github.com/oozie

...