Класс "Combiner" в задании mapreduce

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

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

мой вопрос в том, что означает фраза"коммутативный и ассоциативный " имею в виду в этой ситуации?

2 ответов


Предположим, у вас есть список чисел, 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
  ==
...

например, addition, соответствует этому свойству, как показано ранее. "Максимум" соответствует этому свойству выше также, потому что Макс maxs-это Макс. max (a,b) == max(b, a).

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


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

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


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

  • sum(A, B) совпадает с sum (B, A)
  • xor(A, B) совпадает с xor (B, A)
  • concat (A, B) является не то же, что и concat(B, A)

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

  • (А + Б) + А А + (В + С)
  • (A-B) - C является не то же самое, что и A - (B - C)

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

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

enter image description here