MapReduce

MapReduce — модель пакетной обработки, где независимые map-задачи создают пары (key, value), система группирует значения по ключу, а reduce агрегирует каждую группу.

flowchart LR
    I["Входные блоки"] --> M["Map"]
    M --> S["Shuffle + sort/group by key"]
    S --> R["Reduce"]
    R --> O["Результат"]

Word count

Input:
"java notes"
"java code"
 
Map:
(java, 1), (notes, 1), (java, 1), (code, 1)
 
Shuffle:
java -> [1, 1]
notes -> [1]
code -> [1]
 
Reduce:
(java, 2), (notes, 1), (code, 1)

Map должен обрабатывать partition независимо. Shuffle — дорогой сетевой этап: сериализация, передача, сортировка и группировка. Reduce для одного ключа видит все его значения.

Свойства

  • framework повторяет упавшие задачи, поэтому side effects mapper/reducer должны быть идемпотентными или отсутствовать;
  • skewed key способен отправить огромную группу одному reducer и создать straggler;
  • combiner может локально сократить данные, только если операция допускает частичную агрегацию;
  • число output records и объем shuffle часто важнее CPU map-функции.

Java Stream map(...).reduce(...) использует похожие функциональные идеи, но не является автоматически распределенным MapReduce: там нет обязательного shuffle, fault tolerance и данных на кластере.

На собеседовании

  • Что находится между map и reduce? Shuffle/grouping по ключу.
  • Почему reduce должен быть ассоциативным для параллельного объединения? Порядок группировки частей не фиксирован.
  • Что такое data skew? Несколько ключей получают непропорционально много данных.
  • Stream API равен MapReduce? Нет, это локальная модель вычисления без распределенной инфраструктуры.