SlideShare a Scribd company logo
Big Data aggregation
techniques
by Valentin Logvinskiy
А кто ты такой ?
● 5 лет опыта в web (кроме фриланса)
● 3 года в highload (3k+ request/min)
● 5k requests/min
● >1Tb raw data
● Real time analytic
Проект
«Big Data как секс у подростков: - все говорят об этом, - никто
реально не знает что это такое и что с этим делать, - каждый думает,
что другие уже успешно это делают и - каждый заявляет что
тоже успешно это делает.» (с) просторы интернета
“Данные становятся большими тогда, когда их
размер превращается в самостоятельную
проблему” (с) Роджер Магулас
Для нас Big Data началась с 10 млн. записей
И что ? Сколько данных это Big Data ?
➔ HLL (Hyper Log Log)
➔ Суммирующие таблицы
➔ Partitioning, Sharding
HyperLogLog (HLL)
SELECT COUNT(id) FROM tbl WHERE {...}
SELECT COUNT(DISTINCT token) FROM tbl WHERE {...}
Суммарное количество ивентов по фильтрам
Уникальное количество пользователей по фильтрам
400 msg/second = 24000 msg/minute
1440000 msg/hour = 34560000 msg/day
1 036 800 000 msg/month ( 1 млрд )
Да сколько там тех ивентов !
Мы используем Postgres.
Структура таблиц (изначальная)
Фильтры ?
Distinct ?
SELECT COUNT(DISTINCT token) FROM tbl WHERE {...}
in 40220 ms -> 11194 unique from 3489541 records
in 340220 ms -> 27616 unique from 9658465 records
SELECT COUNT(*) FROM (
SELECT token,COUNT(token) FROM tbl WHERE {...}
GROUP BY token
) q1
11194 ms -> 27616 unique from 9658465 records
Оптимизация запроса через группировку
Как жить дальше ?
MapReduce !!!!
Проблемы работы с исспользованием MapReduce
● Пользователь должен получить результат за допустимый промежуток времени (5-10
секунд)
● Если использовать препроцессинг (подсчитать все возможные варианты которые
может выбрать пользователь) то это будет очень долго
HyperLogLog (HLL)
http://blog.aggregateknowledge.com/tag/hyperloglog/
http://metamarkets.com/2012/fast-cheap-and-98-right-cardinality-estimation-for-big-data/
https://github.com/aggregateknowledge/postgresql-hll
● Bit observable patterns
● Stochastic averaging
● Harmonic averaging
● KMV (K minimum value)
Как это работает
Postgres + HLL
--- Make a dummy table
CREATE TABLE helloworld (
id integer,
set hll
);
--- Insert an empty HLL
INSERT INTO helloworld(id, set) VALUES (1,
hll_empty());
--- Add a hashed integer to the HLL
UPDATE helloworld SET set = hll_add(set,
hll_hash_integer(12345)) WHERE id = 1;
--- Or add a hashed string to the HLL
UPDATE helloworld SET set = hll_add(set, hll_hash_text
('hello world')) WHERE id = 1;
--- Get the cardinality of the HLL
SELECT hll_cardinality(set) FROM helloworld WHERE id =
1;
SELECT ceil(hll_cardinality(hll_union_agg(set))) FROM unique_hll WHERE (...)
125 ms
42012237 unique, >8000000000 records (80 млрд)
А поможет ?
Но есть нюанс ...
● Занимает много места на жестком диске
● Погрешность до 3%
Суммирующие таблицы
Справимся и так !
Amazon EC2, c1.xlarge (4 CPU, 420Gb)
SELECT COUNT(id) FROM event WHERE {...}
Да, да, да. Индексы стоят, работают. Да, partitioning тоже включен и работает.
55 ms -> 342282 records
1714 ms -> 4014783 records
7524 ms -> 20109099 records
Что делать ?
Для связывания этих таблиц исспользуется тригер OnInsert который делает +1 в поле cnt,
если совпадают event_type,campaign_id,item_id,date.
Но есть нюанс...
Batch insert
2014-02-10 00:20:39 UTC [21166]: [3-1] user=****,db=**** ERROR: deadlock detected
2014-02-10 00:20:39 UTC [21166]: [4-1] user=****,db=**** DETAIL: Process 21166 waits for ShareLock on
transaction 1623260082; blocked by process 21162.
Process 21162 waits for ShareLock on transaction 1623260084; blocked by process 21164.
Process 21164 waits for ExclusiveLock on tuple (16351,53) of relation 87300951 of database 16422;
blocked by process 21166.
INSERT INTO tbl VALUES (...),(...),(...),(...)
Выход ?
1. Переписать код на UPDATE и убрать тригерры
2. Игнорировать ошибку, уменьшив уровень изолированости транзакций
3. Ваш вариант
Partitioning
Для чего это нужно?
SELECT COUNT(*) FROM events WHERE date > ‘2014-01-01’ AND date <
‘2014-02-01’
20569s -> 66527031 from 200109099 records
Partitioning by date
Postgres partitioning
CREATE TABLE events_01_2014 (
CHECK ( event_date >= DATE ‘2014-01-01’ AND event_date < DATE ‘2014-02-01’ )
) INHERITS (events);
+ триггер, окончание которого:
RETURN NULL;
Что делать если нет таблицы ?
Добавляем в триггер
IF NOT EXISTS(
SELECT * FROM information_schema.tables WHERE table_name = tableName
) THEN
EXECUTE 'CREATE TABLE '||tableName||' (...) INHERITS (‘||TG_TABLE_NAME||’);';
END IF;
Поможет ?
2569s -> 66527031 from 66703033 records
Sharding
Зачем это нужно ?
Sharding by event type
Таблицы каждого типа находятся на своих серверах БД, что существенно уменьшает
загрузку CPU
Q & A
Thank you !

More Related Content

PDF
Что нужно знать об архитектуре ClickHouse / Алексей Зателепин (Яндекс)
PDF
Clickhouse
PDF
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
PDF
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
PDF
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
PDF
2015.02.06 PostgreSQL в Яндексе: история успеха №2
PDF
2014.10.15 блиц-доклад PostgreSQL kNN search
PDF
Call of Postgres: Advanced Operations (part 5)
Что нужно знать об архитектуре ClickHouse / Алексей Зателепин (Яндекс)
Clickhouse
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
Эффективные алгоритмы поиска подобных объектов для терабайтов данных / Евгени...
2014.12.23 Николай Самохвалов, Ещё раз о JSON(b) в PostgreSQL 9.4
2015.02.06 PostgreSQL в Яндексе: история успеха №2
2014.10.15 блиц-доклад PostgreSQL kNN search
Call of Postgres: Advanced Operations (part 5)

What's hot (20)

PDF
Обзор перспективных баз данных для highload / Юрий Насретдинов
PDF
Эффективные Алгоритмы Поиска Подобных Объектов Для Терабайтов Данных
PDF
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
PDF
Александр Богданов «Lambda - архитектура»
PPT
Lobanov_Cloud-Comput..
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
Аналитика над петабайтами в реальном времени
PDF
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
PPTX
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...
PDF
Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если на...
PPTX
разработка серверов и серверных приложений лекция №2
PDF
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
PDF
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
PPTX
Поиск наизнанку
PDF
Call of Postgres: Advanced Operations (part 4)
PDF
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
PDF
Java GC tuning and monitoring (by Alexander Ashitkin)
PDF
Call of Postgres: Advanced Operations (part 3)
ODP
Кратко о MongoDB
Обзор перспективных баз данных для highload / Юрий Насретдинов
Эффективные Алгоритмы Поиска Подобных Объектов Для Терабайтов Данных
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Александр Богданов «Lambda - архитектура»
Lobanov_Cloud-Comput..
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Аналитика над петабайтами в реальном времени
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...
Антон Щербаков, Отказоустойчивость на примере aviasales — почему даже если на...
разработка серверов и серверных приложений лекция №2
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
Поиск наизнанку
Call of Postgres: Advanced Operations (part 4)
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Java GC tuning and monitoring (by Alexander Ashitkin)
Call of Postgres: Advanced Operations (part 3)
Кратко о MongoDB
Ad

Viewers also liked (9)

PPT
Using Simplicity to Make Hard Big Data Problems Easy
PPTX
Probabilistic data structures
PDF
Big Data Day LA 2015 - Large Scale Distinct Count -- The HyperLogLog algorith...
PDF
Анализ количества посетителей на сайте [Считаем уникальные элементы]
PDF
Probabilistic data structures. Part 2. Cardinality
PDF
ReqLabs PechaKucha Евгений Сафроненко
PDF
HyperLogLog in Hive - How to count sheep efficiently?
PPTX
Hyper loglog
PDF
Deep dive into Coroutines on JVM @ KotlinConf 2017
Using Simplicity to Make Hard Big Data Problems Easy
Probabilistic data structures
Big Data Day LA 2015 - Large Scale Distinct Count -- The HyperLogLog algorith...
Анализ количества посетителей на сайте [Считаем уникальные элементы]
Probabilistic data structures. Part 2. Cardinality
ReqLabs PechaKucha Евгений Сафроненко
HyperLogLog in Hive - How to count sheep efficiently?
Hyper loglog
Deep dive into Coroutines on JVM @ KotlinConf 2017
Ad

Similar to Big Data aggregation techniques (20)

PDF
Александр Шарак, "Одноклассники"
PPT
Cистема внутренней статистики Odnoklassniki.ru
PDF
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
PPT
ADD2010: Обработка большого объема данных на платформеApache Hadoop
PDF
Про аналитику и серебряные пули
PPTX
Hadoops MapReduce framework explanations
PDF
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
PDF
Near-realtime аналитика событий в высоконагруженном проекте
PDF
Near-realtime аналитика событий в высоконагруженном проекте
PDF
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
PDF
Near-realtime аналитика событий в высоконагруженном проекте
PDF
My talk on PgDay Russia 2014
PDF
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PDF
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
PDF
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
PPTX
Big Data - первые шаги
PDF
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
PDF
Дмитрий Долгов
PPTX
DBD lection 4. Big Data, NoSQL. In Russian.
Александр Шарак, "Одноклассники"
Cистема внутренней статистики Odnoklassniki.ru
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
ADD2010: Обработка большого объема данных на платформеApache Hadoop
Про аналитику и серебряные пули
Hadoops MapReduce framework explanations
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте
My talk on PgDay Russia 2014
PG Day'14 Russia, Нетрадиционный PostgreSQL: хранение бинарных данных в БД, А...
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Big Data - первые шаги
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Дмитрий Долгов
DBD lection 4. Big Data, NoSQL. In Russian.

Big Data aggregation techniques

  • 2. А кто ты такой ? ● 5 лет опыта в web (кроме фриланса) ● 3 года в highload (3k+ request/min) ● 5k requests/min ● >1Tb raw data ● Real time analytic Проект
  • 3. «Big Data как секс у подростков: - все говорят об этом, - никто реально не знает что это такое и что с этим делать, - каждый думает, что другие уже успешно это делают и - каждый заявляет что тоже успешно это делает.» (с) просторы интернета “Данные становятся большими тогда, когда их размер превращается в самостоятельную проблему” (с) Роджер Магулас Для нас Big Data началась с 10 млн. записей И что ? Сколько данных это Big Data ?
  • 4. ➔ HLL (Hyper Log Log) ➔ Суммирующие таблицы ➔ Partitioning, Sharding
  • 6. SELECT COUNT(id) FROM tbl WHERE {...} SELECT COUNT(DISTINCT token) FROM tbl WHERE {...} Суммарное количество ивентов по фильтрам Уникальное количество пользователей по фильтрам
  • 7. 400 msg/second = 24000 msg/minute 1440000 msg/hour = 34560000 msg/day 1 036 800 000 msg/month ( 1 млрд ) Да сколько там тех ивентов ! Мы используем Postgres. Структура таблиц (изначальная)
  • 9. Distinct ? SELECT COUNT(DISTINCT token) FROM tbl WHERE {...} in 40220 ms -> 11194 unique from 3489541 records in 340220 ms -> 27616 unique from 9658465 records SELECT COUNT(*) FROM ( SELECT token,COUNT(token) FROM tbl WHERE {...} GROUP BY token ) q1 11194 ms -> 27616 unique from 9658465 records Оптимизация запроса через группировку
  • 10. Как жить дальше ? MapReduce !!!! Проблемы работы с исспользованием MapReduce ● Пользователь должен получить результат за допустимый промежуток времени (5-10 секунд) ● Если использовать препроцессинг (подсчитать все возможные варианты которые может выбрать пользователь) то это будет очень долго
  • 13. Postgres + HLL --- Make a dummy table CREATE TABLE helloworld ( id integer, set hll ); --- Insert an empty HLL INSERT INTO helloworld(id, set) VALUES (1, hll_empty()); --- Add a hashed integer to the HLL UPDATE helloworld SET set = hll_add(set, hll_hash_integer(12345)) WHERE id = 1; --- Or add a hashed string to the HLL UPDATE helloworld SET set = hll_add(set, hll_hash_text ('hello world')) WHERE id = 1; --- Get the cardinality of the HLL SELECT hll_cardinality(set) FROM helloworld WHERE id = 1;
  • 14. SELECT ceil(hll_cardinality(hll_union_agg(set))) FROM unique_hll WHERE (...) 125 ms 42012237 unique, >8000000000 records (80 млрд) А поможет ?
  • 15. Но есть нюанс ... ● Занимает много места на жестком диске ● Погрешность до 3%
  • 17. Справимся и так ! Amazon EC2, c1.xlarge (4 CPU, 420Gb) SELECT COUNT(id) FROM event WHERE {...} Да, да, да. Индексы стоят, работают. Да, partitioning тоже включен и работает. 55 ms -> 342282 records 1714 ms -> 4014783 records 7524 ms -> 20109099 records
  • 19. Для связывания этих таблиц исспользуется тригер OnInsert который делает +1 в поле cnt, если совпадают event_type,campaign_id,item_id,date.
  • 20. Но есть нюанс... Batch insert 2014-02-10 00:20:39 UTC [21166]: [3-1] user=****,db=**** ERROR: deadlock detected 2014-02-10 00:20:39 UTC [21166]: [4-1] user=****,db=**** DETAIL: Process 21166 waits for ShareLock on transaction 1623260082; blocked by process 21162. Process 21162 waits for ShareLock on transaction 1623260084; blocked by process 21164. Process 21164 waits for ExclusiveLock on tuple (16351,53) of relation 87300951 of database 16422; blocked by process 21166. INSERT INTO tbl VALUES (...),(...),(...),(...)
  • 21. Выход ? 1. Переписать код на UPDATE и убрать тригерры 2. Игнорировать ошибку, уменьшив уровень изолированости транзакций 3. Ваш вариант
  • 23. Для чего это нужно? SELECT COUNT(*) FROM events WHERE date > ‘2014-01-01’ AND date < ‘2014-02-01’ 20569s -> 66527031 from 200109099 records
  • 25. Postgres partitioning CREATE TABLE events_01_2014 ( CHECK ( event_date >= DATE ‘2014-01-01’ AND event_date < DATE ‘2014-02-01’ ) ) INHERITS (events); + триггер, окончание которого: RETURN NULL; Что делать если нет таблицы ? Добавляем в триггер IF NOT EXISTS( SELECT * FROM information_schema.tables WHERE table_name = tableName ) THEN EXECUTE 'CREATE TABLE '||tableName||' (...) INHERITS (‘||TG_TABLE_NAME||’);'; END IF;
  • 26. Поможет ? 2569s -> 66527031 from 66703033 records
  • 29. Sharding by event type Таблицы каждого типа находятся на своих серверах БД, что существенно уменьшает загрузку CPU
  • 30. Q & A