2012-04-19 3 views
16

сумматора работает после Mapper и перед редуктором, он будет получать в качестве входных данных всех данных, испускаемых экземплярами Mapper на данный узле. Затем выдает выходной сигнал в редукторы.«сумматор» Класс в работе MapReduce

а также, если функция уменьшения одновременно коммутативной и ассоциативной, то он может быть использован как объединитель.

Мой вопрос: что делает фразу «коммутативной и ассоциативной» означает в этой ситуации ?

ответ

26

Предположим, у вас есть список номеров, 1 2 3 4 5 6.

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

(1) + (2 + 3) + (4 + 5 + 6) 
    == 
(1 + 2) + (3 + 4) + (5) + (6) 
    == 
... 

Подумайте о скобках здесь, как об исполнении объединителя.

Коммутативный означает, что порядок не имеет значения, так:

1 + 2 + 3 + 4 + 5 + 6 
    == 
2 + 4 + 6 + 1 + 2 + 3 
    == 
... 

Например, добавление, подходит это свойство, как показано ранее. «Максимум» соответствует этому свойству выше, так как максимум maxs является максимальным. max (a, b) == max (b, a).

Медиана - пример, который не работает: медиана медианов не является истинной медианной.


Не забудьте еще одно важное свойство объединитель: типы ввода ключа/значения и типы выходов ключевого/значения должны быть одинаковыми. Например, вы не можете взять строку: int и вернуть строку: float.

Часто редуктор может выводить какую-то строку вместо численного значения, что может помешать вам просто подключить редуктор к объединителю.

+0

Может ли кто-нибудь угадать догадку о причине голосования? Мне бы очень хотелось узнать, почему я почему-то не очень хорошо понимаю, так как я все время объясняю объединителям людей. Благодаря! –

+0

Ваш ответ очень помогает, спасибо –

+0

Отличный ответ. Благодаря! –

10

Для коммутативности предположим, что ваш редуктор может быть представлен функцией (в математическом термине), называемой f(). Тогда ваш редуктор коммутативным, если F (а, б) = F (Ь, а) Например:

  • сумма (А, В) такая же, как сумму (В, А)
  • XOR (а, в) такая же, как XOR (в, а)
  • CONCAT (а, в) не такой же, как CONCAT (в, а)

Для ассоциативности, свойство является то, что е (f (a, b), c) = f (a, f (b, c)). Например:

  • (А + В) + С является такой же, как A + (B + C)
  • (А - B) - С не такой же, как A - (B - C)

Так что в контексте Карты/Уменьшения ваш редуктор должен уважать эти 2 свойства. Например, если ваш редуктор выполняет только сумму() или max(), он учитывает оба свойства, но что-то вроде mean() или median() не делает, и поэтому вы не можете использовать его в качестве объединителя.

Я лично вижу сумматоры как мини-редукторы, которые работают в памяти после фазы карты в качестве оптимизации для уменьшения сетевого трафика, а коммутативность/ассоциативность на самом деле имеет смысл, если вы видите Map/Reduce так:

enter image description here