Александр	
  Демидко,	
  
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.	
  Изоляция	
  и	
  автоскейлинг	
  не	
  вошли:	
  
для	
  интересующихся	
  можно	
  поймать	
  меня	
  после	
  доклада	
  

Аналитика над петабайтами в реальном времени

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