Эффективное использование Apache Spark в production

advertisement
Эффективное использование Apache Spark в production —
тонкости и секреты
Александр Сербул
Руководитель направления
Карл…
Карл, Spark работает
очень быстро!
Да, это крутой
инструмент, пап!
Карл…
Карл, я специалист по
BigData….
Это очень
круто,
Но он постоянно падает,
пап! ПАДАЕТ, ПАДАЕТ И
ЗАВИСАЕТ!!!
О чем поговорим
• Использование Spark в production
• Запуск из коробки
• Запуск в Amazon EMR
• Тюнинг, подводные камни
• Как достичь равновесия
Битрикс24 - упрощенно
Битрикс24 - цифры
• Сотни тысяч баз данных клиентов
• Десятки тысяч активных компаний: от единиц до
тысяч сотрудников в каждой
• Несколько датацентров в AWS. Один - в России.
Сервис персональных рекомендаций
~1000 запросов/сек
Batch
процессинг
bitrix.info
analytics.bitrix.info
Регистрация
Выдача ключевой
информации
Хранение
On-line
процессинг
Обработка,
анализ
Сервис персональных рекомендаций
• Кука Пользователя
• Хэш лицензии
Просмотр
товара
Добавление
в корзину
• Домен
• ID товара
Событие
• Название Товара
• Категории Товара
• ID рекомендации
• ряд других
Заказ
Оплата
Заказа
Сервис персональных рекомендаций
~100 запросов/сек
фильтрация
worker (PHP)
~1000 запросов/сек
worker (PHP)
Домены
worker (PHP)
Буфер
bitrix.info
worker (PHP)
worker (PHP)
Лог событий
worker (PHP)
nginx+Lua
Amazon Kinesis
worker (PHP)
worker (PHP)
Пользователи
worker’s
cluster
Amazon
DynamoDB
Сервис персональных рекомендаций
Файл данных
Лог событий
Сервер (spot)
Apache
Tomcat
Сервер (spot)
Apache
Mahout
Сервер (spot)
«Мозги»
Сервер (spot)
Пользователи
Amazon
DynamoDB
Файл данных
Выдача
…
Apache Spark
Amazon S3
analytics.bitrix.info
Домены
Кластер
рекомендаций
Сервис персональных рекомендаций
• Десятки тысяч магазинов
• ~1000 событий в секунду
• Коллаборативная фильтрация
• Кластеризованный товарный каталог (миллионы
товаров)
• Java, Apache Spark, Apache Mahout, DymanoDB,
Kinesis
Технологический roadmap
• Мульти-модальность
• Content-based – рекомендации
• Кластеризация
• Machine learning, deep learning
• Увеличение конверсии
• Эффективность работы с клиентами
• Таргеттинг
Apache Hadoop
• Платформа:
• - вычисления (MapReduce)
• - файловая система (HDFS)
• - “SQL-запросы” по данным (Hive)
Парадигма MapReduce
«Mining of Massive Datasets»: Leskovec, Rajaraman, Ullman (Stanford University)
Apache Spark – что реально удобно
• DAG (directed acyclic graph) vs Hadoop MapReduce vs
Hadoop Streaming
• Spark Programming Guide + API
• Можно на java
• Удобная абстракция: Resilient Distributed Dataset
(RDD)
• Прикольные коллекции, разумно: filter, map,
flatMap
• Sampling по данным (с возвращением и без)
• Scala – как “научный” C++
Как мы используем Spark
• Данные – в s3 (сотни гигабайт-терабайты, сотни миллионов-миллиарды строк)
• RDD – из s3, HDFS – скорость не лучше
• Фильтрация (по регулярным выражениям)
• Аналитика – агрегация, средние, дисперсия, гистограммы, топы
• Выгрузка «больших» файлов моделей (гигабайты)
• Кластеризация товарного каталога (18 млн.) – самописный LSH
• Машинное обучение: Spark MLlib
Apache Spark – что удобно. Быстрый кластер.
• Standalone cluster (или внутри Yarn)
• Просто добавлять машины в кластер
• Подробная-удобная веб-админочка
• Интеграция с HDFS и s3…
Apache Spark – первые грабли. Java7
• Функциональные объекты (куча) из Scala…
• Новые «странные» типы данных: Tuple2, TupleN
• Жуткий нечитаемый код
JavaRDD<String> combinedRowsOrdered = combinedRows.mapToPair(new
PairFunction<String,String,String>() {…
public Tuple2<String,String> call( String row ) {
…return new Tuple2<String, String>…
}
…}
Apache Spark – первые грабли. Scala
• Scala – гораздо сложнее Java, С++/STL «с научным подходом»
• Наука и/или технология
• Модель акторов, Akka
• Java8?
• «Быть или не быть»
Apache Spark – кластер
spark-ec2 скрипт
- standalone cluster
- ruby?, половина репозитория Беркли…
- все ломается при изменении конфигурации
машин, spots
- кривое логирование
- обновление?
Spark + Elastic MapReduce – гораздо лучше!
Amazon EMR - что нам обещают
• Типа готовый Hadoop/Yarn с потрохами 5 размера
• Типа мониторинг всего
• Типа можно изменять размер
• Типа можно использовать копеечные spot-машины
• Типа лучше интегрирован с s3
• Удобные админки через туннелинг и FoxyProxy в
браузере
Amazon EMR - стоимость
• Чуть дороже обычных машин
• Типы машин: Master, Core, Task
• Core-машины – для HDFS, только добавляем
• Можно запускать spot-сервера для Task!
Amazon EMR – софт «из коробки»
• Hadoop/Yarn/HDFS
• Ganglia
• Hive
• Pig
• Hbase
• Impala
• Hue
• Spark!!!
Amazon EMR – Yarn/HDFS
• Удобно менять размер кластера
• HDFS
• Логи работы задач
• У Spark – открывается родной GUI
Минусы:
- Логов море, доработка напильником конфигурации
- Не все можно менять в конфигах, STEPS
Amazon EMR – Ganglia
• Да, типа munin
• Удобно, куча графиков
Минусы:
В GUI остаются убитые spot-машины
Amazon EMR – Hue
• Сначала было удобно
• Много багов
• Убита небольшим объемом данных
Amazon EMR – Hive
• Делаем аналитику - удобно
• Не нужно программировать для Spark
• Простой SQL, мощные возможности (гистограммы,
массивы, maps)
• Не падает «по памяти» - пока
• Отлично интегрирован с DynamoDB, s3
Amazon EMR – Spark!
• Наконец-то
• Родная админка
• Распределение ресурсов
(spark.dynamicAllocation.enabled), только с AMI 4
• Опять море логов и засорение HDFS (100ГБ за неделю)
• Spark History Server - 18080
Amazon EMR – итоги
• Удобно, не нужно 100 сисадминов
• Пока не все идеально, глючит часть софта, но терпимо
• Проклятье логов продолжается 
• Развивается активно, что радует
Apache Spark – падения «по памяти»
• Executor memory (--executor-memory
20G, --conf spark.kryoserializer.buffer.mb=256, --conf
spark.default.parallelism=128, --conf spark.storage.memoryFraction=0.1)
• Map/Reduce
• Partition, repartition…
• KryoSerializer (spark.serializer
org.apache.spark.serializer.KryoSerializer
• Новая Impala (MPP: Presto, RedShift…)? ;-)
)
Apache Spark – выгрузка результатов
• Driver memory (--driver-memory
10G)
• collect()?!
• toLocalIterator()
• rdd.partitions(), rdd.collectPartitions(…)
• Зависания
Apache Spark – ад логирования
export SPARK_LOCAL_DIRS="/mnt/spark,/mnt2/spark"
export SPARK_WORKER_DIR="/mnt/spark_worker"
export SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -
Dspark.worker.cleanup.interval=1800 Dspark.worker.cleanup.appDataTtl=259200"
#Worker executor stdout/stderr logs
spark.executor.logs.rolling.maxRetainedFiles 2
spark.executor.logs.rolling.strategy time
spark.executor.logs.rolling.time.interval daily
Apache Spark – машинное обучение
• Spark MLlib (spark.mllib)
• spark.ml, pipelines
• python “scikit-learn.org”
• Наш опыт – k-means
• Самописный кластеризатор LSH/Spark
Apache Spark – чем придется заниматься
• Детально изучать в логах работы workers, executors – причины
зависаний/ошибок
• Детально освоить web-админку Spark
• Привыкнуть к кластерным особенностям (переменные окружения, библиотеки
…)
• HDFS/s3
• EMR или штат сисадминов
Apache Spark – выводы
• Действительно полезный инструмент
• Распределенная реляционная алгебра – на ура
• Сыроват еще, несовместимость в версиях
• Не очень стабильный в работе
• Битва за машинное обучение – MLlib пока позади scikit-learn
Спасибо за внимание!
Вопросы?
Александр Сербул
@AlexSerbul
serbul@1c-bitrix.ru
Download