Класс "Комбинер" в задании mapreduce

Комбинер запускается после Mapper и до Reducer, он будет принимать в качестве входных данных все данные, испускаемые экземплярами Mapper, в заданном node. затем выдает выходные данные редукторам.

И также, если функция сокращения является как коммутативной и ассоциативной, тогда она может использоваться как Комбинер.

Мой вопрос: что означает в этой ситуации выражение " коммутативный и ассоциативный?

Ответы

Ответ 1

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

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

Ответ 2

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

  • sum (A, B) совпадает с суммой (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)
  • (A - B) - C не совпадает с A - (B - C)

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

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

enter image description here