Ответ
MapReduce — это программная модель и фреймворк для параллельной обработки огромных объёмов данных (петабайты) на больших кластерах (тысячи узлов). Это фундаментальная вычислительная парадигма экосистемы Hadoop.
Принцип работы: Задача разбивается на две основные фазы:
-
Map (Отображение):
- Входные данные разбиваются на независимые фрагменты (сплиты).
- На каждом узле кластера запускается множество Mapper-задач.
- Каждый Mapper обрабатывает один сплит, применяя пользовательскую функцию. На выходе он генерирует набор промежуточных пар ключ-значение.
// Пример: Подсчёт слов. Mapper читает строку и emits (ключ: слово, значение: 1) map(String key, String value): for word in value.split(): emit(word, 1)
-
Shuffle & Sort:
- Фреймворк автоматически распределяет все промежуточные пары с одинаковым ключом на один и тот же узел для Reducer-а.
- Данные сортируются по ключу.
-
Reduce (Свёртка):
- На каждом узле запускаются Reducer-задачи.
- Reducer получает все значения для определённого ключа, агрегирует их (суммирует, усредняет и т.д.) и записывает финальный результат.
// Пример: Reducer суммирует все единицы для каждого слова reduce(String key, Iterator values): sum = 0 for v in values: sum += v emit(key, sum)
Почему это было революционно (и где используется сейчас):
- Отказоустойчивость: Фреймворк автоматически перезапускает упавшие задачи.
- Локалитет данных: Задачи выполняются на узлах, где хранятся данные (HDFS), минимизируя сетевой трафик.
- Наследие: Многие высокоуровневые инструменты (как Apache Hive, Pig) компилируют запросы в цепочки MapReduce-задач. Хотя сегодня для интерактивной аналитики чаще используются более быстрые движки (Apache Spark, Tez), понимание MapReduce критично для отладки и оптимизации работы в экосистеме Hadoop.