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

What's hot (20)

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

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

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

More from Ontico (20)

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

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