Spark MLlib на собеседовании Data Engineer

Проверь себя · 1/3разбор после ответа
Что вернёт запрос SELECT DISTINCT city, country FROM users, если в таблице есть повторяющиеся пары city-country?

Что такое Spark MLlib

Spark MLlib — библиотека машинного обучения внутри Spark. Её главная ценность в том, что она обучает модели распределённо: датасет и вычисления размазаны по кластеру, поэтому можно работать с объёмами в терабайты, которые не влезают в память одной машины.

В MLlib два API, и на собесе важно не перепутать:

  • spark.ml — современный API на основе DataFrame. Именно его сейчас развивают и рекомендуют использовать.
  • spark.mllib — старый API на основе RDD. Он в maintenance-режиме (по сути заморожен), новые проекты на нём не пишут.

Слово «MLlib» по привычке используют для всей библиотеки, но код почти всегда имеет в виду spark.ml.

Pipeline API

Pipeline — центральная абстракция spark.ml. Она позволяет собрать всю подготовку данных и обучение модели в единую цепочку этапов, которая обучается одним вызовом и применяется к новым данным целиком.

from pyspark.ml import Pipeline
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml.classification import GBTClassifier

pipeline = Pipeline(stages=[
    StringIndexer(inputCol="category", outputCol="category_idx"),   # категорию -> числовой индекс
    VectorAssembler(inputCols=["age", "category_idx"], outputCol="features"),  # признаки -> один вектор
    GBTClassifier(featuresCol="features", labelCol="label")          # обучаемая модель
])

model = pipeline.fit(train_df)          # обучение всей цепочки
predictions = model.transform(test_df)  # применение к новым данным

Идея та же, что у пайплайнов scikit-learn, но всё выполняется распределённо. Полезно знать терминологию: Transformer только преобразует данные (transform), а Estimator обучается и порождает Transformer (fit). Pipeline избавляет от рассинхрона между обучением и инференсом — препроцессинг зашит в модель, а не воспроизводится руками.

ALS

ALS (Alternating Least Squares) — алгоритм матричной факторизации для коллаборативной фильтрации, флагманский рекомендательный метод MLlib. Он раскладывает большую разреженную матрицу «пользователь × объект» на два малых фактора и предсказывает пропущенные оценки.

from pyspark.ml.recommendation import ALS

als = ALS(rank=10, regParam=0.1, userCol="user", itemCol="item", ratingCol="rating")
model = als.fit(ratings_df)

# топ-10 рекомендаций каждому пользователю
user_recs = model.recommendForAllUsers(10)

Главный плюс — ALS хорошо параллелится и масштабируется до миллиардов оценок, поэтому его берут именно там, где данных о взаимодействиях очень много. На собесе про рекомендации ALS стоит уметь объяснить: что такое rank (размерность латентных факторов), зачем regParam (регуляризация против переобучения) и в чём проблема холодного старта для новых пользователей.

Градиентный бустинг деревьев

MLlib умеет обучать градиентный бустинг деревьев (GBT) распределённо:

from pyspark.ml.classification import GBTClassifier

gbt = GBTClassifier(maxIter=100, maxDepth=5)
model = gbt.fit(train_df)

Здесь есть важный нюанс, который любят проверять на собесе:

  • GBT в Spark медленнее, чем XGBoost или LightGBM на одной машине, — распределённость даёт накладные расходы.
  • Он оправдан, когда данные реально не помещаются на одну машину и нужно обучать прямо на кластере.
  • Если датасет влезает в память сервера, XGBoost/LightGBM обучатся быстрее и часто дадут качество не хуже.

То есть выбор в пользу Spark GBT — это про масштаб данных, а не про качество модели.

Готовишься к собесу Data Engineer?
Spark, Airflow, ClickHouse, SQL для DE — вопросы с разборами в Telegram
Тренировать DE в Telegram

Когда использовать

MLlib подходит, когда:

  • Данные измеряются терабайтами и не влезают в одну машину — обучение идёт прямо на кластере.
  • У вас уже есть Spark-инфраструктура, и не хочется тащить отдельный ML-стек.
  • Речь про сотни миллионов примеров и распределённая обработка неизбежна.

MLlib не подходит, когда:

  • Задача — deep learning: для этого берут TensorFlow/PyTorch, а Spark используют максимум для подготовки данных.
  • Датасет помещается на одну машину — тогда XGBoost, LightGBM или sklearn быстрее и удобнее.

Честный ответ на собесе: в реальной практике в РФ MLlib для обучения моделей в проде используют нечасто — большинство задач умещается в одну машину, где single-node библиотеки быстрее. Чаще Spark применяют для распределённой подготовки данных и фичей, а само обучение выносят в отдельный пайплайн. Знание этого нюанса показывает, что вы понимаете реальные trade-off'ы, а не просто заучили список алгоритмов.

Как это спрашивают на собесе

Spark MLlib на DE-собесе обычно всплывает в двух форматах. Первый — прямой вопрос «работали ли с MLlib, что использовали». Второй, более интересный, — это вопрос на выбор инструмента внутри system design: «нужно обучить модель на 2 ТБ данных, как будете это делать».

На что смотрит интервьюер:

  • Понимаете ли, когда распределённый ML вообще нужен. Сильный кандидат сначала спросит про объём данных и только потом предложит MLlib или single-node.
  • spark.ml vs spark.mllib. Знание, что RDD-API устарел, — маркер актуального опыта.
  • Trade-off Spark GBT vs XGBoost. Правильно назвать, что Spark медленнее, но берёт масштабом.
  • Роль Spark в ML-пайплайне. Что чаще Spark — это про data prep и фичи, а не про само обучение.

Типичная ошибка — предлагать MLlib на любую ML-задачу «потому что есть Spark», не задумываясь о размере данных. Это читается как отсутствие практики.

Связанные темы

FAQ

Чем spark.ml отличается от spark.mllib?

spark.ml — современный API на основе DataFrame, его рекомендуют и развивают. spark.mllib — старый RDD-based API в maintenance-режиме. Новые проекты пишут на spark.ml, а название «MLlib» осталось по привычке для всей библиотеки.

Когда Spark GBT лучше, чем XGBoost?

Только когда данные не помещаются на одну машину и нужно обучать распределённо на кластере. Если датасет влезает в память сервера, XGBoost или LightGBM обучатся быстрее и обычно дадут сопоставимое качество. Выбор Spark GBT — про масштаб, а не про точность.

Что такое ALS и для чего он?

ALS (Alternating Least Squares) — алгоритм матричной факторизации для коллаборативной фильтрации. Он раскладывает разреженную матрицу «пользователь × объект» на латентные факторы и предсказывает пропущенные оценки. Хорошо масштабируется на большие объёмы взаимодействий, но страдает от проблемы холодного старта.

Можно ли делать deep learning в MLlib?

Нет, MLlib не предназначен для глубокого обучения. Для нейросетей берут TensorFlow или PyTorch, а Spark в таком пайплайне используют для распределённой подготовки данных и фичей перед обучением.

Это официальная информация?

Нет. Статья основана на документации Spark MLlib и опыте прохождения собеседований. Конкретный стек и глубина вопросов зависят от компании и команды.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.