Открыть сервис

MapReduce

MapReduce — это модель программирования и соответствующая программная реализация для обработки больших объёмов данных (Big Data) на кластерах компьютеров, разработанная компанией Google. Модель автоматизирует распараллеливание вычислений, распределение данных, управление сбоями и балансировку нагрузки, позволяя программистам, не имеющим опыта в разработке распределённых систем, эффективно обрабатывать терабайты и петабайты информации. Основная идея заключается в разделении задачи на две основные фазы: Map (отображение) и Reduce (свёртка).

История

Концепция MapReduce была впервые представлена в 2004 году в технической статье Джеффри Дина и Саджея Гемавата, инженеров Google. Статья описывала созданную в компании инфраструктуру, которая позволяла обрабатывать огромные массивы данных на тысячи машин в отказоустойчивом режиме. Ключевым стимулом стала необходимость ранжирования веб-страниц, построения инвертированных индексов и других задач, связанных с веб-поиском, которые не могли быть выполнены на одном сервере. В 2008 году Google заявила, что с помощью MapReduce ежемесячно обрабатывается более 20 петабайт данных.

Важнейшую роль в популяризации модели сыграла реализация с открытым исходным кодом — Hadoop MapReduce, созданная под руководством Дага Каттинга в рамках проекта Apache. Разработка началась в 2005 году, а в 2008-м Hadoop стал лидером среди фреймворков для распределённой обработки данных. Это позволило не только крупным IT-компаниям, но и среднему бизнесу и научным организациям внедрять технологии Big Data без собственных закрытых разработок.

Позднее, с развитием потребностей в низко-латентной обработке, модель MapReduce частично уступила роль более специализированным системам, таким как Apache Spark, которые могут выполнять итеративные вычисления быстрее за счёт обработки данных в оперативной памяти. Тем не менее, концепция MapReduce остаётся фундаментальной для понимания распределённой обработки.

Модель программирования

Модель основана на двух абстрактных функциях, заимствованных из функционального программирования: Map и Reduce. Программист описывает эти две функции, а среда исполнения берёт на себя все задачи по организации распределённого вычисления.

Фаза Map

Функция Map принимает на вход входную пару ключ-значение и порождает набор промежуточных пар ключ-значение. Эта функция выполняется параллельно на множестве узлов (mappers). Система самостоятельно разбивает входные данные на фрагменты (splits) и распределяет их между mapper-ами. Результатом работы фазы Map является набор промежуточных данных, сгруппированных по ключу.

Пример (псевдокод для подсчёта слов в наборе документов): `` map(String key, String value): // key: имя документа // value: содержимое документа for each word w in value: EmitIntermediate(w, "1"); ``

Фаза Shuffle (Перемешивание)

Между фазами Map и Reduce существует неявная, но критически важная фаза Shuffle. Система автоматически сортирует и группирует все выходные данные от mapper-ов по ключу. Значения с одинаковыми ключами собираются в один список. Эта фаза требует интенсивного сетевого обмена и операций ввода-вывода.

Фаза Reduce

Функция Reduce принимает на вход ключ и список всех значений, соответствующих этому ключу, и порождает один (или несколько) итоговых результатов. Вызовы функции Reduce выполняются независимо друг от друга на разных узлах (reducers), каждый из которых обрабатывает свой уникальный ключ.

Продолжение примера: `` reduce(String key, Iterator values): // key: слово // values: список единиц int result = 0; for each v in values: result += parseInt(v); Emit(AsString(result)); ``

Архитектура и реализация

В типичной реализации, такой как Hadoop MapReduce, вычисления управляются центральным узлом (JobTracker, в Hadoop 2.x — ResourceManager). DataNodes и TaskTrackers (или NodeManagers) выполняют непосредственную обработку на узлах, где хранятся данные. Ключевой принцип — качество данных (data locality): код перемещается на узлы с данными, а не наоборот, что минимизирует сетевой трафик.

Ключевые компоненты Hadoop MapReduce:

Обработка данных

  1. InputSplit: Входные данные разбиваются на логические отрезки (splits), каждый из которых соответствует одному mapper-у.
  2. RecordReader: Считывает данные из InputSplit и преобразует их в пары ключ-значение.
  3. MapTask: Выполняет пользовательскую функцию Map для каждой пары.
  4. Combiner (опционально): Мини-Reduce, выполняемый на mapper-е для локального агрегирования результатов, уменьшая объём передаваемых данных.
  5. Partitioner: Определяет, на какой reducer отправить пары ключ-значение, основываясь на хеше ключа.
  6. ReduceTask: Загружает отсортированные данные с mapper-ов, выполняет пользовательскую функцию Reduce и записывает результат в HDFS.

Виды и вариации

Изначально MapReduce предназначался для пакетной (batch) обработки данных, но со временем появились его модификации и аналоги:

Применение

MapReduce стал стандартом для множества задач, требующих линейной масштабируемости:

Преимущества и ограничения

Преимущества:

Ограничения:

Влияние и наследие

MapReduce оказал фундаментальное влияние на развитие инженерии данных. Он продемонстрировал, как с помощью простой модели можно решать задачи, казавшиеся ранее непосильными для обычных организаций. Хотя сегодня для большинства новых проектов предпочитают Apache Spark, впечатление от Hadoop MapReduce остаётся значительным. Многие современные распределённые системы (от NoSQL-баз до систем потоковой обработки) используют те же принципы локальности данных, отказоустойчивости и партиционирования, что были впервые массово реализованы в MapReduce.

Работа над моделью продолжается в академической и индустриальной среде: исследуются возможности сокращения латентности, оптимизации сетевого обмена и интеграции с нереляционными хранилищами. Сам термин «MapReduce» стал нарицательным для класса систем, разделяющих вычисление на две фазы, и используется в языке SQL (запросы с фазами Map и Reduce), а также в NoSQL-базах данных.

Интересные факты

Источники

  1. Dean, J., & Ghemawat, S. (2004). MapReduce: Simplified Data Processing on Large Clusters. OSDI.
  2. White, T. (2012). Hadoop: The Definitive Guide. O'Reilly Media.
  3. Lin, J., & Dyer, C. (2010). Data-Intensive Text Processing with MapReduce. Morgan & Claypool Publishers.
  4. Apache Hadoop Documentation. MapReduce Tutorial.
  5. Карпов, Д. В. (2015). Технологии Big Data: MapReduce и Hadoop. Издательство МГТУ им. Н. Э. Баумана.
  6. Материалы курсов по распределённым вычислениям и Big Data (МФТИ, НИУ ВШЭ, 2015-2023).

)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →