Аналитика над петабайтами в реальном времени
TRANSCRIPT
Александр Демидко, So2ware engineer @ Metamarkets
Аналитика над петабайтами в реальном времени
Откуда данные? { !
“type”: “ad impression”, !“country”: “Canada”, !“age”: 30, !“gender”: “M”, !“adsize”: “320x100”, !“device”: “iPhone 7”, !“site”: “bestbooze.com”, !
!… !
} !
{ !“type”: “ad click”, !… !
} !
Запросы
-‐ Процент платящих из Китая за декабрь, пришедших с сайтов автомобильной тематики? -‐ Процент кликов в рекламной кампании XXXXXXXX от пользователей iPhone 5 и выше? -‐ Какая страница чаще всего редактировалась в эту неделю? -‐ Сколько гигабайт на вход прокачал 10.5.160.201 за вчера? -‐ Число уникальных пользователей за последний час?
Big Data Ad-‐hoc Queries Low Latency Querying $$$$
Big Data
Ad-‐hoc Queries
Low Latency Querying
WAT?
No free lunch
Цифры, цифры, цифры
Процессинг Входящих событий поточно: 25Tb/день, 23Gb/мин в пике Входящих событий батчем: 160Tb/день 1 событие ≈ 1Kb
Хранилище
400Tb сжатых данных (≈ 50-‐100Pb сырых) 1000 запросов/мин в пике 90% <1 сек, 95% <2 сек, 99% <10 сек
Стоимость
на три порядка меньше за событие, чем у “обычной” платформы аналитики
Где храним
Druid (h�p://druid.io) In-‐house, open-‐source (Apache License, Yay!) ✔ Распределение запросов и данных ✔ Колоночное хранение ✘Ограничиваем число уникальных рядков (UUID) ✘ После записи данные не меняются ✘ Нет джойнов
Обработка потоковых данных
API
Logic
map, filter, union, join,
…
? Обновление логики на новую версию ? Как запроцессить данные еще раз
Druid
Обработка потоковых данных II
API Logic
Apache Ka�a -‐ Топики (показы, клики, конверсии) -‐ N разделов на топик -‐ Сообщения в разделе упорядочены -‐ Клиент управляет чтением -‐ Храним неделю данных -‐ Реплицируем 2x
Ka�a Druid
Pipeline logic
map
Ka�a read
filter filter
Ka�a read
join
map
Druid save
Druid save
filter
Guaranteed delivery
map
Ka�a read
filter filter
Ka�a read
join
map
Druid save
Druid save
filter
Пофейлились: -‐ Забить: at most once -‐ Повторить: at least once -‐ ???: Exactly once
Обработка потоковых данных III
API
Ka�a Druid
Apache Storm
join/group by/cogroup
Accumulator
Flusher
Redis
10:16 | keyE => event7, event8, … 10:16 | keyD => event6, … 10:15 | keyC => event5, … …
10:01 | keyB => event1, event2 10:00 | keyA => event3, …
15 мин окно
Redis
keyA, keyC keyB,keyD,keyE
Это все?
API
? Опоздавшие на join события ? Отсутствие exactly once ? Хотим запроцессить данные старше 7ми дней (буфер в Ka�a)
Ka�a Druid
Storm
Redis
λ-‐архитектура
API
Ka�a Druid
Storm
Redis
HDFS – 2x hardware – 2x code
Storm -‐ Закрытый код -‐ Открытые аналоги: Twi�er Summingbird, Spark/Spark Streaming
Теперь все? Не-‐а Сложности Storm:
-‐ Сильная связанность -‐ Чувствителен к потерям пакетов -‐ Неочевидно, где узкое место в производительности и какой уровень параллелизма выставлять
Слишком много тонкой настройки L
Apache Samza
Ka�a
-‐ Пишем промежуточные результаты на диск в Ka�у -‐ Узкое место там, где отстаем по чтению из Ka�и -‐ Join/group by без Redis
API
Ka�a Druid
Ka�a Junior
HDFS
Метрики
Репортим: байт/событий обработано отставание от Ka�и использовано памяти в Druidе …
С параметрами:
версия пайплайн хост …
λ ?
Спасибо!
P.S. Изоляция и автоскейлинг не вошли: для интересующихся можно поймать меня после доклада