SlideShare a Scribd company logo
Пайплайн машинного
обучения на Apache
Spark
Павел Клеменков, Rambler&Co
p.klemenkov@rambler-co.ru
Remember when Rambler used to be a search engine?
Pepperidge Farm remembers
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Мотивационный пример
• Обучили модель CTR (PySpark,
vowpal wabbit
• Предикт ~= baseline CTR
• Закинули модель в сервис
(Vert.X, VW JNI)
• Предикт != baseline CTR
• В чем дело?
• Из-за sparse-формата,
потерялись некоторые фичи
Что хотим от математика-программиста?
• Качественные эксперименты быстро
• Доведение эксперимента до продакшена
• Поддержка и багфиксы
WTF is this shit?!
All my code works!
And I didn’t break the build!
Качественный эксперимент быстро
• Знакомое окружение
• Все новое и крутое
• Витрина фич
Эксперимент в продакшене
• Простое тестирование
• Окружение как на продакшене
• Автоматизация
Эксплуатация и багфиксы
• Простой и наглядный мониторинг
• Адресные оповещения
• Доступная отладка
С чего стартовали?
HDFS
+
Hive
SCP
NFS
Custom
scripts
Redis
Cluster
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
Monitoring
(DIY)
ML
(local)
You got a problem
with that?!
+
HDFS
+
Hive
SCP
NFS
Custom
scripts
Redis
Cluster
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
Monitoring
(DIY)
ML
(local)
HDFS
+
Hive
Redis
Cluster
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
Monitoring
(DIY)
ML
(local)
Kafka
Gobblin
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
HDFS
+
Hive
Redis
Cluster
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
Monitoring
(DIY)
ML
(local)
Kafka
Gobblin
HDFS
+
Hive
Aerospike
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
Monitoring
(DIY)
ML
(local)
Kafka
Gobblin
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
HDFS
+
Hive
Aerospike
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
Monitoring
(DIY)
ML
(local)
Kafka
Gobblin
HDFS
+
Hive
Aerospike
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
ML
(local)
Kafka
Gobblin
Graphite Grafana
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
HDFS
+
Hive
Aerospike
Hive
streaming
ML
(local)
Cron +
joblocker
Hive
streaming
ML
(local)
Kafka
Gobblin
Graphite Grafana
HDFS
+
Hive
Aerospike
Hive
streaming
ML
(local)
Airflow
Hive
streaming
ML
(local)
Kafka
Gobblin
Graphite Grafana
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
HDFS
+
Hive
Aerospike
Hive
streaming
ML
(local)
Airflow
Hive
streaming
ML
(local)
Kafka
Gobblin
Graphite Grafana
Со стриммингом одни проблемы (
Diagnostic Messages for this Task:
Error: java.lang.RuntimeException: Hive Runtime Error
while closing operators
SELECT TRANSFORM(*) USING 'python script.py'
FROM table;
И даже тесты не помогут…
INSERT OVERWRITE TABLE predict
SELECT TRANSFORM(line)
FROM features_table
USING 'umworld_caller.py apply -f model.vw'
AS uid, probabilities;
Traceback (most recent call last)
----> uid, probabilities =
'0000000149C7211B6A53058C0942A001 1.3752,-
0.37520000000149BBA4BF2CC10CD6043D1401 1.3752,-
0.3752'
ValueError: too many values to unpack
Очень долго готовить данные
Типичный алгоритм эксперимента
• Выгрузить сэмпл из Hive
• Сконвертировать в Pandas
• Поиграть с данными
• Понять, что чего-то не хватает
• Выгрузить другой сэмпл из Hive…
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
HDFS
+
Hive
Aerospike
Hive
streaming
Airflow
Kafka
Gobblin
Graphite Grafana
Spark +
ML
Почему ?
It is in-memory and
there is a Python API!
Pandas vs Spark Dataframe
import pandas as pd
!hive -e "select * from
users" > dt.csv
df = pd.read_csv("dt.csv")
counts = df[df.age > 30]
.groupby("sex")
.count()
from pyspark.sql import
HiveContext
ctx = HiveContext(sc)
df = ctx.sql("select * from
users")
counts = df[df.age > 30]
.groupby("sex")
.count()
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
А на самом деле…
SPARK-15139
PySPark TreeEnsemble
missing methods
SPARK-18177
Add missing ‘subsamplingRate’
of pyspark GBTClassifier
SPARK-17025
Cannot persist PySpark ML
Pipeline model that includes
custom Transformer
SPARK-15194
Add Python ML API for
MultivariateGaussian
Архитектура Spark
Resilient
Distributed
Dataset
rdd1.join(rdd2)
.groupby(...)
.filter(...)
RDD
Partition
Partition
Partition
Partition
Job
Stage
Task
Task
Task
Task
action
Driver
SparkContext
Cluster
Manager
Worker Node
Executor Cache
Task Task
Worker Node
Executor Cache
Task Task
Урок №1
При запуске задачи необходимо явно
указывать требуемые ресурсы. Это
сильно упрощает жизнь
Урок №2
При запуске задачи необходимо явно
указывать требуемые ресурсы. Это
сильно усложняет жизнь
Narrow (no shuffle):
• map
• flatMap
• filter
• sample
Wide (shuffle):
• sortByKey
• reduceByKey
• groupByKey
• join
Урок №3
Избегайте shuffle
Вся прелесть DataFrame
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Почему DataFrame
такой быстрый?
• RDD – низкоуровневый API без оптимизаций
• DataFrame – это Spark SQL
• Catalyst – оптимизатор запросов
• Tungsten Execution Backend
Урок №4
Используя DataFrame можно меньше
париться про оптимизацию
вычислений
Урок №5
При чтении из Hive, Spark создает
партиции по числу бакетов таблицы
Use XGBoost, Luke
© Unknown Kaggler
Почему мы не используем
Spark.ML?
Причина №1
• Vowpal Wabbit и XGBoost в старом пайплайне
• Новый код для напилки фич
Причина №2
SPARK-14374
PySpark ml GBTClassifier, Regressor
support export/import
(Resolved: 15/Apr/16)
SPARK-13034
PySpark ml.classification support
export/import
(Resolved: 16/Mar/16)
Причина №3Качествонаобучении
Объем обучающей выборки
Но мы верили, что
все изменится :)
Поэтому поддержали API Spark.ML
from pyspark.ml.pipeline import Transformer
class BaseTransformer(Transformer):
def __init__(self, day=None)
def fit(self, df)
def _transform(self, df)
def load(self, timestamp)
def save(self, timestamp)
Spark
Context
Py4J
Spark
Context
Local
FS
Spark
Worker
Spark
Worker
Python
Python
Python
Python
Python
Python
Socket
Pipe
Python JVM
Урок №6
При работе с PySpark overhead есть не
только у самого Python, но и на
перегонку объектов в/из JVM
Урок №7
Для сериализации используется
cloudpickle, а он не всемогущ
Talk is cheap.
Show me the code!
class SparkXGBoostClassifier(SparkSklearnClassifier):
def predict_proba(self, df):
rdd = df.map(self._create_dataset)
df = rdd.toDF()[['uid', 'feature']]
v_model = df._sc.broadcast(self.model)
res = df.rdd.mapPartitionsWithIndex(
partial(apply_model, v_model=v_model))
return res
Timing (100 executors – 8gb, 2 vcores)
Подзадача Время
Загрузить и сджойнить фичи 0:08:49
Сконвертировать трейн в Pandas 0:07:43
Настройка модели 0:01:44
Вычисление качества 0:04:44
Применение модели 0:46:07
Сконвертировать вероятность в ответ 0:02:24
Итого 1:13:05
Those, who ask questions.
You da real MVP!

More Related Content

PDF
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
PDF
My talk at Highload++ 2015
PDF
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
PDF
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
PDF
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
PDF
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
PDF
Алексей Федоров
PDF
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
My talk at Highload++ 2015
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как 100 000 раз в секунду выбирать правильный рекламный материал? Programmati...
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Алексей Федоров
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)

What's hot (20)

PPTX
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
PPTX
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
PPTX
Как собирать gps треки раз в секунду, экономя траффик
PDF
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
PPTX
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
PPTX
Денис Иванов
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
PPTX
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
PDF
2020.10.13 HA Redis is simple. FWDays Highload
PDF
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
PDF
Облако в Badoo год спустя
PDF
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PDF
Вячеслав Бахмутов
PPTX
Тестирование через мониторинг или холакратия на практике / Максим Чистяков (U...
PDF
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
PPTX
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
PPTX
Антон Турецкий
PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
PPTX
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Как собирать gps треки раз в секунду, экономя траффик
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Денис Иванов
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
2020.10.13 HA Redis is simple. FWDays Highload
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Облако в Badoo год спустя
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Вячеслав Бахмутов
Тестирование через мониторинг или холакратия на практике / Максим Чистяков (U...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Антон Турецкий
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Ad

Similar to Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co) (11)

PDF
Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache ...
PPTX
Пайплайн машинного обучения на Apache Spark
PDF
Spark overview (18.06.2015)
PDF
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
PDF
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
PDF
Машинное обучение в электронной коммерции - практика использования и подводны...
PPTX
Программирование на PySpark
PPTX
[Expert Fridays] Python MeetUp - Леонид Блохин: "Нейросети на питоне: пфф easy"
PDF
Expert Fridays Spark Job
PDF
Введение в машинное обучение
PDF
Apache spark
Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache ...
Пайплайн машинного обучения на Apache Spark
Spark overview (18.06.2015)
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
Машинное обучение в электронной коммерции - практика использования и подводны...
Программирование на PySpark
[Expert Fridays] Python MeetUp - Леонид Блохин: "Нейросети на питоне: пфф easy"
Expert Fridays Spark Job
Введение в машинное обучение
Apache spark
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
PDF
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)

Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)