near-realtime аналитика событий в высоконагруженном проекте
TRANSCRIPT
![Page 1: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/1.jpg)
Near-realtime аналитика событий в высоконагруженном проекте
Крашенинников АлександрBadoo
![Page 2: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/2.jpg)
Пара цифр о Badoo
• 270М пользователей
• 5М новых фото в день
• 400К регистраций в сутки
• 3К серверов
• 70К RPS на PHP-FPM
![Page 3: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/3.jpg)
Что мы обсудим
• Зачем анализировать события в проекте?
• Что можно подвергнуть анализу?
• Какие средства и решения вы можете для этого использовать?
![Page 4: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/4.jpg)
Зачем что-то анализировать?
Хочешь улучшить ― измерь!
![Page 5: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/5.jpg)
Что вообще измерять?
![Page 6: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/6.jpg)
Что вообще измерять?
![Page 7: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/7.jpg)
Технические метрики
• RPS
• SQL запросы
• кэш
• взаимодействия с сервисами
![Page 8: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/8.jpg)
Pinba• MySQL-extension
• Все данные in-memory
• Транспорт: GPB over UDP
• Поддерживает таймеры, теги, агрегации
• Клиенты для PHP, Java, Go, Python, Ruby, JS, модуль nginx
![Page 9: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/9.jpg)
Hit/miss у ключей «user_%»?
![Page 10: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/10.jpg)
Какой запрос печалит кластер?
![Page 11: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/11.jpg)
Не подойдет для продуктовых метрик
• Нужны сырые данные для кастомных аналитических запросов
• Данные нужны в широком диапазоне (часы, сутки)
![Page 12: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/12.jpg)
Продуктовые метрики
• количество регистраций
• отправка сообщений/лайков
• загрузки медийного контента
• источники трафика
![Page 13: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/13.jpg)
StatsCollector• Внутренняя разработка BI Badoo
• Сбор событий в MySQL
• Счетчики, шардинг
• Он доставляет!!!
• Ссылка в конце доклада :)
![Page 14: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/14.jpg)
StatsCollector
![Page 15: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/15.jpg)
Нюансы• события одного типа собираются на
один MySQL-хост
• нет поддержки составных типов данных
• разнородность событий — проблемы при добавлении атрибутов
• нет единого flow обработки
![Page 16: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/16.jpg)
Нужно свежее решение!
![Page 17: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/17.jpg)
Сбор требований
Выясняем, что нужно пользователям новой системы
![Page 18: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/18.jpg)
Требования продуктов
• говорить с разработкой «на одном языке»
• настраиваемые разрезы и агрегаты
• апдейты каждые несколько минут
• дашборды, графики, таблички!!!
![Page 19: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/19.jpg)
Требования разработчиков
• минимум усилий
• единый API отправки событий
• отладка на сырых данных
• функциональность tail/grep
![Page 20: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/20.jpg)
Качественные требования
• возможность масштабирования
• отказоустойчивость
• высокая производительность
• работа с миллионами метрик
• долговременное хранение сырых данных
![Page 21: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/21.jpg)
![Page 22: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/22.jpg)
Unified Data Stream (UDS)
• язык описания данных
• сбор событий с application-серверов
• обработка
• визуализация
• долговременное хранение
![Page 23: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/23.jpg)
Описание событий
• специальный формат
• кодогенерация для backend
• формат при отправке: JSON (помним про хотелку tail/grep)
![Page 24: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/24.jpg)
Тело события
![Page 25: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/25.jpg)
Транспорт — берем готовый?
• О, да это просто! Есть же куча готовых!
• Ага, но еще есть:– Текущая инфраструктура– Требования к доставке– Гетерогенность событий
![Page 26: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/26.jpg)
Транспорт — опять scribe?
![Page 27: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/27.jpg)
Транспорт — опять scribe?
• Доставляет надежно
• Плавали — знаем
• Но он же legacy!
• И падает иногда
Ладно, пока возьмем...
![Page 28: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/28.jpg)
Транспорт — а сами?
• Live Streaming Daemon (LSD)
– Из приложения пишем в файлы– Дальше — как scribe,
только лучше– Coming open-source soon!
![Page 29: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/29.jpg)
Flow событий в ДЦ
App(web, cloud)> 1K hosts
Аггрегатор< 10 hosts
![Page 30: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/30.jpg)
Обработка на Агрегаторе
• запись в файлы (а-ля logrotate)• gzip
• inotify
• В случае недоступности HDFS — буфер на 24 часа
![Page 31: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/31.jpg)
Структура в HDFS
• /local/UDS/– /date=2015-01-01/
● /hour=00/
udshost1.mlan_001.gzudshost1.mlan_002.gzudshost2.mlan_001.gz…
– /date=2015-02-02/
![Page 32: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/32.jpg)
Пробуем обработать — Hive
• SQL-подобный интерфейс над данными в файлах на HDFS
• «Мои запросы могут показаться тебе странными …» (несколько экранов)
• Обработка суточных данных занимает очень много времени (а хочется realtime)
![Page 33: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/33.jpg)
Как ускорить обработку?
• Divide and conquer!
• Вычислить агрегаты в коротких временных интервалах, и сохранить
• Для расчета суточных/месячных/годовых данных использовать сумму агрегатов
![Page 34: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/34.jpg)
Apache Spark
● Фреймворк для распределенной обработки данных
• Интеграция с Hadoop
• Данные in-memory
• Streaming API «из коробки»
![Page 35: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/35.jpg)
Apache Spark - Streaming
• Строго говоря, это batching
• Можно грабить корованы выполнять map-reduce
• Весь входящий поток событий превращается в гомогенную коллекцию, размещенную в памяти машин кластера
![Page 36: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/36.jpg)
Streaming API
«Каждые 15 секунд проверить наличие новых файлов в HDFS-директории, и запустить обработку каждой строки»
![Page 37: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/37.jpg)
Streaming API
• Я умею wc -l !!!
• strings.map(inputLine → 1).reduce(
(cnt1, cnt2) → cnt1 + cnt2)
).count() // 42
![Page 38: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/38.jpg)
Концепция изменилась!• Подсчет агрегаций на MR
отличается от SQL
• Поток разнородных событий, с разными наборами вычислений, надо преобразовать в гомогенный
• Для каждого события надо посчитать пермутации из его разрезов
![Page 39: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/39.jpg)
Обработка события
Задача: посчитать min/max/avg/sum платежей за последние час и сутки, в разрезе по стране и полу
![Page 40: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/40.jpg)
Обработка события
1. Берем 2 свеклы JSON-path
2. Парсим значимые поля события, согласно конфигурации (hello, products!)
3. Множим по числу комбинаций
4. Суммируем одинаковые комбинации
![Page 41: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/41.jpg)
Большой взрыв события
![Page 42: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/42.jpg)
Подсчет агрегатов
![Page 43: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/43.jpg)
Суммирование проекций
![Page 44: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/44.jpg)
Хранение агрегатов• /data/uds/agg/
– /minute/● 2015-10-01-04-00-00_2015-10-04-01-00● 2015-10-01-04-01-00_2015-10-04-02-00
– /hour/● 2015-10-01-02-00-00_2015-10-03-00-00● 2015-10-01-03-00-00_2015-10-04-00-00
![Page 45: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/45.jpg)
Вычисление метрик
• Метрика — сумма одинаковых проекций, посчитанная за интервал NOW() - N минут
• Для каждого из желаемых интервалов берем данные из сохраненных агрегатов
• Повторяем процедуру суммирования
![Page 46: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/46.jpg)
Результат вычислений
Все результаты сохранены в директориях HDFS
![Page 47: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/47.jpg)
Что делать с результатами
• Отправка в time-series хранилища (rrd, Influx, etc.)
• Сохранение в базу данных
• Дашборды, графики, таблички!!!
![Page 48: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/48.jpg)
Посчитайте уникальных юзеров!
![Page 49: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/49.jpg)
Мысли вслух
● Комбинаций — сотни тысяч● К каждой — hash с user_id● Не, ну ладно — bitset ● На каждую комбинацию —
сотня мегабайт● Не успеем считать суточные
агрегации
![Page 50: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/50.jpg)
«Почти честное» решение
● HyperLogLog — вероятностная структура для подсчета уникальных значений
● Настраивается процент погрешности (больше памяти → меньше ошибка)
● 0.5% погрешности ~ 32Kb на объект
![Page 51: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/51.jpg)
Удав, который проглотил слона
![Page 52: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/52.jpg)
Что мы научились● 80/20 — принцип Паретто
● count/sum/avg/min/max/first/last● approx distinct
● Да, пока нет перцентилей и точного DISTINCT
● Но возможность прикрутить-то имеется!
![Page 53: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/53.jpg)
Пучок цифр и фактов● 300К events/sec в пике (больше
пока не придумали :)● 25 серверов в Hadoop-кластере
(не только для нашей задачи)● В 300 раз уменьшили объем данных
для анализа (за счет замены сырых данных на агрегаты)
![Page 54: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/54.jpg)
Scientia potencia est!
(Знание — сила)
![Page 55: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/55.jpg)
Есть простые инструменты для решения ваших сложных
задач
![Page 56: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/56.jpg)
Where to go from here
1. tech.badoo.com/Техблог Badoo
2. pinba.orgReal-time аналитика вашего приложения
3. bit.ly/StatsCollector Доклад о StatsCollector
4. spark.apache.org
![Page 57: Near-realtime аналитика событий в высоконагруженном проекте](https://reader033.vdocuments.pub/reader033/viewer/2022042706/58ab7aa51a28abb54e8b6e29/html5/thumbnails/57.jpg)
Спасибо за внимание,я готов ответить на Ваши
вопросы!
[email protected]@gmail.com
facebook.com/alex.krash