Работали ли вы с MapReduce?

«Работали ли вы с MapReduce?» — вопрос из категории Apache Spark, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал с MapReduce, в основном в контексте Apache Spark. В Spark модель MapReduce реализуется через преобразования RDD или DataFrame. Например, классическая задача подсчета слов:

val textFile = sc.textFile("hdfs://...")
val counts = textFile
  .flatMap(line => line.split(" "))
  .map(word => (word, 1))
  .reduceByKey(_ + _)
counts.collect()

Почему Spark, а не классический Hadoop MapReduce:

  • In-memory вычисления: Spark кэширует данные в оперативной памяти, что на порядки ускоряет итеративные алгоритмы (машинное обучение, графовые вычисления).
  • Более богатый API: Помимо map и reduce, есть filter, join, groupByKey, aggregateByKey и высокоуровневые DataFrame/Dataset.
  • Управление ресурсами: Интеграция с YARN, Mesos или собственным кластерным менеджером Spark Standalone.

Пример сложной агрегации (среднее по ключу):

val data = sc.parallelize(Seq(("a", 10), ("b", 20), ("a", 30)))
val sumCount = data.aggregateByKey((0, 0))(
  (acc, value) => (acc._1 + value, acc._2 + 1), // seqOp внутри партиции
  (acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2) // combOp между партициями
)
val averages = sumCount.mapValues{ case (sum, count) => sum.toDouble / count }
// Результат: (a, 20.0), (b, 20.0)

В продакшене использовал эту модель для ETL-пайплайнов, агрегации логов и подготовки данных для ML-моделей.