57
Near-realtime аналитика событий в высоконагруженном проекте Крашенинников Александр Badoo

Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

  • Upload
    ontico

  • View
    423

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Near-realtime аналитика событий в высоконагруженном проекте

Крашенинников АлександрBadoo

Page 2: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Пара цифр о Badoo

• 270М пользователей

• 5М новых фото в день

• 400К регистраций в сутки

• 3К серверов

• 70К RPS на PHP-FPM

Page 3: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Что мы обсудим

• Зачем анализировать события в проекте?

• Что можно подвергнуть анализу?

• Какие средства и решения вы можете для этого использовать?

Page 4: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Зачем что-то анализировать?

Хочешь улучшить ― измерь!

Page 5: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Что вообще измерять?

Page 6: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Что вообще измерять?

Page 7: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Технические метрики

• RPS

• SQL запросы

• кэш

• взаимодействия с сервисами

Page 8: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Pinba• MySQL-extension

• Все данные in-memory

• Транспорт: GPB over UDP

• Поддерживает таймеры, теги, агрегации

• Клиенты для PHP, Java, Go, Python, Ruby, JS, модуль nginx

Page 9: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Hit/miss у ключей «user_%»?

Page 10: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Какой запрос печалит кластер?

Page 11: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Не подойдет для продуктовых метрик

• Нужны сырые данные для кастомных аналитических запросов

• Данные нужны в широком диапазоне (часы, сутки)

Page 12: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Продуктовые метрики

• количество регистраций

• отправка сообщений/лайков

• загрузки медийного контента

• источники трафика

Page 13: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

StatsCollector• Внутренняя разработка BI Badoo

• Сбор событий в MySQL

• Счетчики, шардинг

• Он доставляет!!!

• Ссылка в конце доклада :)

Page 14: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

StatsCollector

Page 15: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Нюансы• события одного типа собираются на

один MySQL-хост

• нет поддержки составных типов данных

• разнородность событий — проблемы при добавлении атрибутов

• нет единого flow обработки

Page 16: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Нужно свежее решение!

Page 17: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Сбор требований

Выясняем, что нужно пользователям новой системы

Page 18: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Требования продуктов

• говорить с разработкой «на одном языке»

• настраиваемые разрезы и агрегаты

• апдейты каждые несколько минут

• дашборды, графики, таблички!!!

Page 19: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Требования разработчиков

• минимум усилий

• единый API отправки событий

• отладка на сырых данных

• функциональность tail/grep

Page 20: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Качественные требования

• возможность масштабирования

• отказоустойчивость

• высокая производительность

• работа с миллионами метрик

• долговременное хранение сырых данных

Page 21: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)
Page 22: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Unified Data Stream (UDS)

• язык описания данных

• сбор событий с application-серверов

• обработка

• визуализация

• долговременное хранение

Page 23: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Описание событий

• специальный формат

• кодогенерация для backend

• формат при отправке: JSON (помним про хотелку tail/grep)

Page 24: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Тело события

Page 25: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Транспорт — берем готовый?

• О, да это просто! Есть же куча готовых!

• Ага, но еще есть:– Текущая инфраструктура– Требования к доставке– Гетерогенность событий

Page 26: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Транспорт — опять scribe?

Page 27: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Транспорт — опять scribe?

• Доставляет надежно

• Плавали — знаем

• Но он же legacy!

• И падает иногда

Ладно, пока возьмем...

Page 28: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Транспорт — а сами?

• Live Streaming Daemon (LSD)

– Из приложения пишем в файлы– Дальше — как scribe,

только лучше– Coming open-source soon!

Page 29: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Flow событий в ДЦ

App(web, cloud)> 1K hosts

Аггрегатор< 10 hosts

Page 30: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Обработка на Агрегаторе

• запись в файлы (а-ля logrotate)• gzip

• inotify

• В случае недоступности HDFS — буфер на 24 часа

Page 31: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Структура в 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 аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Пробуем обработать — Hive

• SQL-подобный интерфейс над данными в файлах на HDFS

• «Мои запросы могут показаться тебе странными …» (несколько экранов)

• Обработка суточных данных занимает очень много времени (а хочется realtime)

Page 33: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Как ускорить обработку?

• Divide and conquer!

• Вычислить агрегаты в коротких временных интервалах, и сохранить

• Для расчета суточных/месячных/годовых данных использовать сумму агрегатов

Page 34: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Apache Spark

● Фреймворк для распределенной обработки данных

• Интеграция с Hadoop

• Данные in-memory

• Streaming API «из коробки»

Page 35: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Apache Spark - Streaming

• Строго говоря, это batching

• Можно грабить корованы выполнять map-reduce

• Весь входящий поток событий превращается в гомогенную коллекцию, размещенную в памяти машин кластера

Page 36: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Streaming API

«Каждые 15 секунд проверить наличие новых файлов в HDFS-директории, и запустить обработку каждой строки»

Page 37: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Streaming API

• Я умею wc -l !!!

• strings.map(inputLine → 1).reduce(

(cnt1, cnt2) → cnt1 + cnt2)

).count() // 42

Page 38: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Концепция изменилась!• Подсчет агрегаций на MR

отличается от SQL

• Поток разнородных событий, с разными наборами вычислений, надо преобразовать в гомогенный

• Для каждого события надо посчитать пермутации из его разрезов

Page 39: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Обработка события

Задача: посчитать min/max/avg/sum платежей за последние час и сутки, в разрезе по стране и полу

Page 40: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Обработка события

1. Берем 2 свеклы JSON-path

2. Парсим значимые поля события, согласно конфигурации (hello, products!)

3. Множим по числу комбинаций

4. Суммируем одинаковые комбинации

Page 41: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Большой взрыв события

Page 42: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Подсчет агрегатов

Page 43: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Суммирование проекций

Page 44: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Хранение агрегатов• /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 аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Вычисление метрик

• Метрика — сумма одинаковых проекций, посчитанная за интервал NOW() - N минут

• Для каждого из желаемых интервалов берем данные из сохраненных агрегатов

• Повторяем процедуру суммирования

Page 46: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Результат вычислений

Все результаты сохранены в директориях HDFS

Page 47: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Что делать с результатами

• Отправка в time-series хранилища (rrd, Influx, etc.)

• Сохранение в базу данных

• Дашборды, графики, таблички!!!

Page 48: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Посчитайте уникальных юзеров!

Page 49: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Мысли вслух

● Комбинаций — сотни тысяч● К каждой — hash с user_id● Не, ну ладно — bitset ● На каждую комбинацию —

сотня мегабайт● Не успеем считать суточные

агрегации

Page 50: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

«Почти честное» решение

● HyperLogLog — вероятностная структура для подсчета уникальных значений

● Настраивается процент погрешности (больше памяти → меньше ошибка)

● 0.5% погрешности ~ 32Kb на объект

Page 51: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Удав, который проглотил слона

Page 52: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Что мы научились● 80/20 — принцип Паретто

● count/sum/avg/min/max/first/last● approx distinct

● Да, пока нет перцентилей и точного DISTINCT

● Но возможность прикрутить-то имеется!

Page 53: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Пучок цифр и фактов● 300К events/sec в пике (больше

пока не придумали :)● 25 серверов в Hadoop-кластере

(не только для нашей задачи)● В 300 раз уменьшили объем данных

для анализа (за счет замены сырых данных на агрегаты)

Page 54: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Scientia potencia est!

(Знание — сила)

Page 55: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Есть простые инструменты для решения ваших сложных

задач

Page 56: Near-realtime аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

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 аналитика событий в высоконагруженном проекте / Александр Крашенинников (Badoo)

Спасибо за внимание,я готов ответить на Ваши

вопросы!

[email protected]@gmail.com

facebook.com/alex.krash