Эффективное использование 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