Spark MLlib на собеседовании Data Engineer
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 — это про масштаб данных, а не про качество модели.
Когда использовать
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», не задумываясь о размере данных. Это читается как отсутствие практики.
Связанные темы
- Spark RDD vs DataFrame для DE
- Collaborative filtering для DS
- XGBoost vs LightGBM vs CatBoost для DS
- Feature store для DS
- Подготовка к собесу Data Engineer
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+ вопросами для собесов.