- Evolution of data structures in Yandex.Metrica
-
-
-
-
-
-
-
-
Evolution of data structures in Yandex.Metrica
-
-
-
-
Evolution of data structures in Yandex.Metrica
-
-
-
-
Introduction
-
-
-
-
About me
-
Alexey, developer of ClickHouse.
-
I work on data processing engine of Yandex.Metrica since 2008.
-
-
-
-
About Yandex
-
Yandex is one of the largest internet companies in Europe operating Russia’s most popular search engine.
-
-
-
-
About Yandex.Metrica
-
Yandex.Metrica (https://metrica.yandex.com/) is a service for web analytics.
-
Largest in Russia, second largest in the world (just after Google Analytics).
-
-
We are processing about ~25 billions of events (page views, conversions, etc).
-
We must generate and show reports in realtime.
-
-
-
-
-
-
-
-
History
-
-
-
-
How to store data?
-
Big data processing is not a problem.
-
The challenge is how to store data in that way to allow both:
-
- efficient ingestion of click stream in realtime;
-
- efficient generation of reports;
-
-
Let review our historical solutions first...
-
-
-
-
MySQL (MyISAM) 2008-2011
-
We have had about 50 predefined report types.
-
We create a table for each of them.
-
Each table has primary key in form of:
-
site_id, date, key -> aggregated statistics.
-
The data was inserted in mini-batches of aggregated deltas, using ON DUPLICATE KEY UPDATE.
-
-
... but this just don't work.
-
-
-
-
Data locality on disk (artistic view)
-
The main concern is data locality.
-
-
-
-
-
MySQL (MyISAM) 2008-2011
-
We use HDD (rotational drives). We cannot afford petabytes of SSDs.
-
Each seek is ~12 ms of latency, usually no more than 1000 random reads/second in RAID array.
-
-
Time to read data from disk array is dependent on: - number of seeks; - total amount of data;
-
-
Example: read 100 000 rows, randomly scattered on disk: - at least 100 seconds in worst case. User won't wait hundred seconds for the report.
-
-
The only way to read data from disk array in appropriate amount of time is to minimize number of seek by maintaining data locality.
-
-
-
-
MySQL (MyISAM) 2008-2011
-
Fundamental problem:
-
-
Data is inserted almost in time order:
- - each second we have new portion data for this second;
- - but data for different web sites are comes in random order in a stream;
-
-
Data is selected by ranges for specified web site and date period:
- - in ranges of completely different order;
-
-
-
-
MySQL (MyISAM) 2008-2011
-
MyISAM stores data in MYD and MYI files. MYD contains data almost in order of insertion. MYI contains B-tree index that maps a key to offset in MYD file.
-
Insertion of data is almost fine. But selecting of data by range of primary key was non-practical.
-
Nevertheless, we made it work by:
-
- - tricky partitioning;
- - organizing data in few generations with different partitioning scheme;
- - moving data between tables by scheduled scripts;
- - report generation becomes ugly UNION ALL queries.
-
-
-
-
MySQL (MyISAM) 2008-2011
-
As of 2011 we was storing about 580 billion rows in MyISAM tables.
-
We were not satisfied by performance and maintenance cost:
- Example: page title report loading time, 90% quantile was more than 10 seconds.
-
... After all, everything was converted and deleted.
-
-
-
-
Metrage, 2010-2015
-
(Specialized data structure, developed specially for aggregation of data and report generation).
-
To maintain data locality, we need to constantly reordering data by primary key.
-
We cannot maintain desired order at INSERT time, nor on SELECT time; we must do it in background.
-
Obviously: we need an LSM-tree!
-
-
-
-
Metrage, 2010-2015
-
Metrage: Metrica + Aggregated statistics.
-
We have created custom data structure for that purpose.
-
In 2010, there was no LevelDB. We just got some insights from article about TokuDB.
-
Metrage is designed for the purpose of realtime data aggregation:
- - row in Metrage table is custom C++ struct with update and merge methods.
-
Example: a row in Metrage table could contain a HyperLogLog.
-
Data in Metrage is aggregated: - on insertion, in batches; - during background compaction; - on the fly, during report generation.
-
-
-
-
Metrage, 2010-2015
-
Everything was working fine. The problem of data locality was solved. Reports was loading quickly.
-
As of 2015 we stored 3.37 trillion rows in Metrage and used 39 * 2 servers for this.
-
But we have had just ~50 pre-defined reports.
-
No customization and drill down was possible.
-
The user wants to slice and dice every report by every dimension!
-
-
... and we have developed just another custom data structure.
-
-
-
-
The report builder, 2010
-
We had quickly made a prototype of so-called "report builder".
-
This was 2010 year. It was just simple specialized column-oriented data structure.
-
It worked fine and we got understanding, what the right direction to go.
-
We need good column-oriented DBMS.
-
-
-
-
Why column-oriented?
-
This is how "traditional" row-oriented databases work:
-
-
-
-
-
Why column-oriented?
-
And this is how column-oriented databases work:
-
-
-
-
-
Why column-oriented?
-
Hypothesis:
-
If we have good enough column-oriented DBMS, we could store all our data in non-aggregated form (raw pageviews and sessions) and generate all the reports on the fly, to allow infinite customization.
-
To check this hypothesis, we started to evaluate existing solutions.
-
MonetDB, InfiniDB, Infobright and so on...
-
No appropriate solutions were exist in 2010.
-
-
-
-
ClickHouse
-
As an experimental project, we started to develop our own column-oriented DBMS: ClickHouse.
-
In 2012 it was in production state.
-
In 2014 we re-lauched Yandex.Metrica as Metrica 2.
-
All data is stored in ClickHouse and in non-aggregated form and every report is generated on the fly.
-
In Metrika 2 the user could create it's own report with
- - custom dimensions, metrics, filters, user-centric segmentation...
- - and to dig through data to the detail of individual visitors.
-
-
-
-
ClickHouse
-
The main target for ClickHouse is query execution speed.
-
In Yandex.Metrika, users could analyze data for their web sites of any volume.
-
Biggest classifieds and e-commerce sites with hundreds millions PV/day are using Yandex.Metrika (e.g. ru.aliexpress.com).
-
In contrast to GA*, in Yandex.Metrika, you could get data reports for large web sites without sampling.
-
As data is processed on the fly, ClickHouse must be able to crunch all that pageviews in sub second time.
-
* in Google Analytics you could get reports without sampling only in "premium" version.
-
-
-
-
The main cluster of Yandex.Metrica
-
-
20.6 trillions of rows (as of Feb 2017)
-
450 servers
-
total throughput of query processing is up to two terabytes per second
-
-
* If you want to try ClickHouse, one server or VM is enough.
-
-
-
-
ClickHouse
-
-
column-oriented
-
distributed
-
linearly scalable
-
fault-tolerant
-
data ingestion in realtime
-
realtime (sub-second) queries
-
support of SQL dialect + extensions (arrays, nested data types, domain-specific functions, approximate query execution)
-
-
-
-
-
Open-source (since June 2016)
-
We think ClickHouse is too good to be used solely by Yandex.
-
We made it open-source. License: Apache 2.0.
-
https://github.com/yandex/ClickHouse/
-
-
-
-
Open-source
-
More than 100 companies is already using ClickHouse.
-
Examples: Mail.ru, Cloudflare, Kaspersky...
-
-
-
-
When to use ClickHouse
-
For well structured, clean, immutable events.
-
-
Click stream. Web analytics. Adv. networks. RTB. E-commerce.
-
Analytics for online games. Sensor and monitoring data. Telecom data.
-
-
-
-
When not to use ClickHouse
-
OLTP ClickHouse doesn't have UPDATE statement and full-featured transactions.
-
Key-Value If you want high load of small single-row queries, please use another system.
-
Blob-store, document oriented ClickHouse is intended for vast amount of fine-grained data.
-
Over-normalized data Better to make up single wide fact table with pre-joined dimensions.
- «When we evaluated ClickHouse the results were great compared to Prestodb. Even though the columnar storage optimizations for ORC and Clickhouse is quite similar, Clickhouse uses CPU and Memory resources more efficiently (Presto also uses vectorized execution but cannot take advantage of hardware level optimizations such as SIMD instruction sets because it's written in Java so that's fair) so we also wanted to add support for Clickhouse for our open-source analytics platform Rakam (https://github.com/rakam-io/rakam)»
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch letterpress.
-
Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid four loko quinoa.
-
Echo Park 8-bit sustainable umami deep v Kickstarter.
-
-
-
Inline Elements
-
Retro meh brunch aesthetic Cosby sweater Shoreditch. Banksy Tumblr sriracha, flexitarian pug chia master cleanse vinyl wayfarers fanny pack bespoke Helvetica roof party. Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag, leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical <paleo> you probably haven’t heard of.
-
-
-
-
Quotes
-
-
Flannel bicycle rights locavore selfies skateboard. Authentic fanny pack paleo four loko bespoke. Artisan tattooed chia XOXO ennui, lomo disrupt 8-bit art party Tumblr scenester.
Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag.
-
Leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical paleo you probably haven’t heard of.
-
-
-
-
Latin and Cyrillic List Bullets
-
-
Occupy locavore blog, mustache you probably haven't heard of them
Cray pug paleo retro, Echo Park narwhal Wes Anderson
-
Disrupt Williamsburg fixie, shabby chic bicycle rights hashtag kogi
-
-
-
-
Two Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
-
-
-
Three Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
С 2008 занимался движком обработки данных в Яндекс.Метрике.
-
-
-
-
-
ClickHouse — это аналитическая СУБД.
-
Один запрос — много данных на входе, мало на выходе.
-
Данные нужно агрегировать налету.
-
-
-
-
Метрика 2.0
-
-
-
-
-
Пример запроса
-
SELECT MobilePhoneModel, COUNT(DISTINCT UserID) AS u
- FROM hits
- WHERE MobilePhoneModel != ''
- GROUP BY MobilePhoneModel
- ORDER BY u DESC
-
-
-
-
-
Чтобы быстро обрабатывать запросы, данные необходимо:
-
-
быстро читать;
-
быстро считать.
-
-
-
Конвейер выполнения запроса:
-
— фильтрация, JOIN, агрегация, сортировка...
-
-
-
-
Как тестировать производительность?
-
Бенчмарки должны быть:
-
-
на реальных данных;
-
на разных наборах данных, покрывающих разные кейсы;
-
воспроизводимые;
-
автоматизированные.
-
-
-
-
-
Пример бенчмарка (не лучшего)
-
/** Выполнять так:
-for file in MobilePhoneModel PageCharset Params URLDomain UTMSource Referer URL Title; do
- for size in 30000 100000 300000 1000000 5000000; do
- echo
- BEST_METHOD=0
- BEST_RESULT=0
- for method in {1..10}; do
- echo -ne $file $size $method '';
- TOTAL_ELEMS=0
- for i in {0..1000}; do
- TOTAL_ELEMS=$(( $TOTAL_ELEMS + $size ))
- if [[ $TOTAL_ELEMS -gt 25000000 ]]; then break; fi
- ./hash_map_string_3 $size $method < ${file}.bin 2>&1 |
- grep HashMap | grep -oE '[0-9\.]+ elem';
- done | awk -W interactive '{ if ($1 > x) { x = $1 }; printf(".") } END { print x }' |
- tee /tmp/hash_map_string_3_res;
- CUR_RESULT=$(cat /tmp/hash_map_string_3_res | tr -d '.')
- if [[ $CUR_RESULT -gt $BEST_RESULT ]]; then
- BEST_METHOD=$method
- BEST_RESULT=$CUR_RESULT
- fi;
- done;
- echo Best: $BEST_METHOD - $BEST_RESULT
- done;
-done
-*/
-
-
-
-
Агрегация
-
-
-
-
Одна машина, одно ядро
-
-
-
-
Плохой способ
-
Читаем данные в массив; сортируем по ключу;
-идём по группам ключей и считаем агрегатные функции.
-
Достоинства:
-
+ простота интерфейса агрегатных функций;
-+ возможность более эффективной реализации агрегатных функций;
-+ можно запускать произвольные скрипты для reduce в режиме streaming.
-
Недостатки:
-
− пусть N — общее число данных, а M — количество ключей;
-Отвратительно работает при N > M — в типичном случае.
-Тратится O(N) оперативки на промежуточные данные вместо O(M).
-
-
-
-
Хороший способ
-
Читаем данные, кладём в ассоциативный массив
-
key tuple -> states of aggregate functions
-
обновляем состояния агрегатных функций.
-
-
-
-
Какой ассоциативный массив?
-
Lookup-таблица. Хэш-таблица.
-
Бинарное дерево. Skip-лист. B-дерево.
-
Трай. Трай+хэш-таблица...
-
-
-
-
Бинарное дерево
-
− слишком большой оверхед на элемент;
-
− отвратительная кэш-локальность;
-
− вообще тормозит.
-
-
-
-
Skip-лист. Трай. B-дерево...
-
− вообще для другой задачи;
-
-
-
-
Lookup-таблица
-
+ прекрасно для агрегации по числовым ключам не более ~16 бит;
-
− не подходит для чуть более сложных случаев.
-
-
-
-
Хэш-таблица
-
+ моя любимая структура данных;
-
− много деталей.
-
-
-
-
Трай+хэш-таблица
-
+ иногда кое что в этом есть, см. далее;
-
-
-
-
Одна машина, много ядер
-
-
-
-
1. Тривиальный способ
-
-
Разные потоки читают разные данные по мере возможности.
-Агрегируют независимо в свои локальные хэш-таблицы.
-Когда все данные прочитаны, мержим все хэш-таблицы в одну.
-Например, идём по всем локальным хэш-таблицам кроме первой
- и перекладываем всё в первую.
-
-Фаза чтения данных и предварительной агрегации распараллеливается.
-Фаза мержа выполняется последовательно.
-
-Пусть N — общее число данных, а M — количество ключей.
-O(M) работы выполняется последовательно
- и при большом M (кардинальность GROUP BY)
- работа плохо распараллеливается.
-
-Достоинства: тривиально.
-
-Недостатки: не масштабируется при большой кардинальности.
-
-
-
-
-
2. Partitioning способ
-
-
Для каждого блока данных, выполняем агрегацию в две стадии:
-
-Стадия 1.
-Разные потоки будут обрабатывать разные куски блока, какие успеют.
-В каждом потоке, с помощью отдельной хэш-функции,
- хэшируем ключ в номер потока и запоминаем его.
-
- hash: key -> bucket_num
-
-Стадия 2.
-Каждый поток идёт по всему блоку данных
- и берёт для агрегации только строки с нуждым номером корзины.
-
-Модификация: можно всё в одну стадию — тогда каждый поток
-будет вычислять хэш-функцию от всех строк заново:
- подходит, если это дёшево.
-
-
-
-
-Достоинства:
-+ хорошо масштабируется при большой кардинальности
- и равномерном распределении ключей;
-+ идейная простота.
-
-Недостатки:
-− если объём данных распределён неравномерно по ключам,
- то стадия 2 плохо масштабируется.
-Это типичный случай.
-Почти всегда объём данных по ключам распределён по power law.
-
-Ещё недостатки:
-− если размер блока маленький, то получается слишком
- мелко-гранулированная многопоточность:
- большой оверхед на синхронизацию;
-− если размер блока большой, то плохая кэш-локальность;
-− на второй стадии, часть memory bandwidth умножается на число потоков;
-− нужно вычислять ещё одну хэш-функцию,
- она должна быть независима от той, что в хэш-таблице;
-
-
-
-
-
3. Параллельный мерж хэш-таблиц
-
-
Отресайзим полученные в разных потоках хэш-таблицы к одному размеру.
-Разобъём их неявно на разные подмножества ключей.
-В разных потоках будем мержить соответствующие
- подмножества ключей хэш-таблиц.
-
-Рисунок на доске.
-
-Недостаток:
-− очень сложный код.
-
-
-
-
-
4. Ordered мерж хэш-таблиц
-
-
Для open addressing linear probing хэш-таблиц, или для chaining хэш-таблиц,
-данные в хэш-таблице расположены почти упорядоченно
-по остатку от деления хэш-функции на размер хэш-таблицы
-— с точностью до цепочек разрешения коллизий.
-
-Отресайзим полученные в разных потоках хэш-таблицы к одному размеру.
-Сделаем ordered iterator, который будет
- перебирать данные в хэш-таблице в фиксированном порядке.
-
-Объём работы на итерирование:
- количество цепочек разрешения коллизий * средний квадрат длин цепочек.
-
-Сделаем merging iterator, который с помощью heap (priority queue)
- будет перебирать все хэш-таблицы разом.
-
-
-
-
Достоинства:
-
-+ не нужно никуда перекладывать элементы: мерж делается inplace.
-
-+ бонус: подходит для внешней памяти.
-
-
-Недостатки:
-
-− отвратительно сложный код;
-
-− для open addressing linear probing хэш-таблиц,
- средний квадрат длин цепочек разрешения коллизий слишком большой;
-
-− priority queue тормозит;
-
-− стадия мержа не распараллеливается*
-
-
-* — можно совместить с предыдущим способом.
-
-
-
-
-
5. Robin Hood ordered мерж хэш-таблиц
-
-
Если использовать Robin Hood хэш-таблицу, то данные
-(за исключением O(1) граничных цепочек разрешения коллизий)
-будут полностью упорядочены
-по остатку от деления хэш-функции на размер хэш-таблицы.
-
-Достоинства:
-+ вроде бы красивый алгоритм.
-+ бонус: подходит для внешней памяти.
-
-Недостатки:
-− вынуждает использовать robin-hood probing;
-− priority queue тормозит;
-− стадия мержа не распараллеливается*
-
-
-
-
-
6. Shared хэш-таблица под mutex-ом
-
-
Достоинства: очень просто.
-
-Недостатки: отрицательная масштабируемость.
-
-
-
-
-
7. Много мелких хэш-таблиц под разными mutex-ами
-
-
В какую класть — выбирается с помощью отдельной хэш-функции.
-
-Недостатки:
-
-− в типичном случае данные распределены сильно неравномерно,
- и потоки будут конкурировать на одной горячей корзине.
-
-− в случае маленькой хэш-таблицы, слишком тормозит.
-
-Достоинства: если данные почему-то распределены равномерно,
- то кое-как масштабируется.
-
-
-
-
-
8. Shared хэш-таблица и в каждой ячейке spin-lock
-
-
Недостатки:
-
-− spin-lock — это очень опасно;
- очень сложно тестировать производительность;
- вы обязательно сделаете отстой.
-
-− в типичном случае данные распределены сильно неравномерно,
- и потоки будут конкурировать на одной горячей ячейке.
-
-
-
-
-
9. Lock free shared хэш-таблица
-
-
Недостатки:
-
-− lock free хэш-таблицы либо нельзя ресайзить, либо они очень сложные;
-
-− в типичном случае данные распределены сильно неравномерно,
- и потоки будут конкурировать на одной горячей ячейке:
- false sharing, тормоза.
-
-− сложный код, много инструкций, всё тормозит;
-
-− я вообще недолюбливаю lock-free алгоритмы.
-
-
-
-
-
10. Shared хэш-таблица + thread local хэш-таблицы
-
-
Пытаемся положить в shared хэш-таблицу путём блокирования ячейки;
-если ячейка уже заблокирована — кладём к локальную хэш-таблицу.
-
-Тогда горячие ключи попадут в локальные хэш-таблицы.
-Локальные хэш-таблицы будут маленькими.
-В конце мержим все локальные хэш-таблицы в глобальную.
-
-Дополнения: можно сначала смотреть
- на наличие ключа в локальной хэш-таблице.
-
-Достоинства:
-+ отлично масштабируется;
-+ сравнительно простая реализация.
-
-Недостатки:
-− много лукапов, много инструкций — в целом довольно медленно.
-
-Даже не смотря на то, что thread local хэш-таблица
- зачастую ещё и cache local.
-
-
-
-
-
11. Two-level хэш-таблица
-
-
На первой стадии, в каждом потоке независимо
-кладём данные в свои num_buckets = 256 хэш-таблиц,
-хранящих разные ключи.
-
-В какую из них класть (номер корзины)
-определяется другой хэш-функцией,
-либо отдельным байтом хэш-функции.
-
-Имеем num_threads * num_buckets хэш-таблиц.
-
-На второй стадии мержим состояния
-num_threads * num_buckets хэш-таблиц
-в одни num_buckets хэш-таблиц,
-распараллеливая мерж по bucket-ам.
-
-
-
-
-Достоинства:
-
-+ отлично масштабируется;
-+ простота реализации;
-
-+ бонус: ресайзы хэш-таблиц амортизируются;
-
-+ бонус: нахаляву получаем в результате partitioning,
- который полезен для других стадий конвейера.
-
-+ бонус: подходит для внешней памяти.
-
-Недостатки:
-
-− при большой кардинальности, во время мержа
- делается до такого же объёма работ как на первой стадии;
-
-− при маленькой кардинальности,
- слишком много отдельных хэш-таблиц;
-
-− при маленькой кардинальности,
- работает несколько медленнее тривиального способа;
-
-
-
-
-
12. Тривиальный + two-level хэш-таблица
-
-
Используем тривиальный способ.
-
-Когда разных ключей много, конвертируем в two-level.
-
-Именно такой способ используется в ClickHouse :)
-
-
-
-
-
-
Много машин, много ядер
-
-
На разных машинах расположены части данных,
-которые надо обработать.
-
-Отличия от shared memory:
-
-— почти отсутствует возможность work stealing;
-— нужно явно передавать данные по сети.
-
-
-
-
-
1. Тривиальный способ
-
-
Передаём промежуточные результаты на сервер-инициатор запроса.
-Последовательно кладём всё в одну хэш-таблицу.
-
-Достоинства:
-
-+ тривиально;
-+ хорошо масштабируется при маленькой кардинальности.
-
-Недостатки:
-
-− при большой кардинальности не масштабируется;
-− требуется оперативка на весь результат.
-
-
-
-
-
2. Ordered merge
-
-
Передаём промежуточные результаты на сервер-инициатор запроса
-в заданном порядке. Мержим.
-
-Достоинства:
-+ тратится O(1) оперативки;
-
-Недостатки:
-− при большой кардинальности не масштабируется;
-− мерж сортированных потоков (heap) — это медленная операция;
-− требуется либо сортировать результаты на удалённых серверах,
- либо использовать один из тех fancy алгоритмов выше.
-
-
-
-
-
3. Partitioned merge
-
-
Передаём промежуточные результаты на сервер-инициатор запроса,
-разбитыми на отдельные согласованные корзины-партиции,
-в заданном порядке корзин.
-
-Мержим по одной или по несколько корзин одновременно.
-
-Достоинства:
-+ тратится до в num_buckets раз меньше оперативки, чем размер результата;
-+ можно легко распараллелить, мержа сразу несколько корзин
- — отлично масштабируется по ядрам.
-
-Недостатки:
-− мерж делается на одном сервере — инициаторе запроса
- — эта стадия не масштабируется по серверам.
-
-
-Именно такой способ используется в ClickHouse :)
-
-
-
-
-
-
4. Reshuffle + partitioned merge
-
-
На удалённых серверах получаем промежуточные результаты,
-разбитые на согласованные партиции.
-
-Затем передаём партиции между серверами так,
-чтобы на разных серверах были разные партиции,
-а данные одной партиции оказались на одном сервере.
-
-Мержим на всех серверах параллельно, да ещё и используя многие ядра.
-
-Достоинства:
-+ прекрасно масштабируется;
-+ при INSERT SELECT, результат можно
- вовсе не передавать на сервер-инициатор,
- а сразу сохранить в распределённую таблицу на кластере.
-
-Недостатки:
-− сложная координация серверов;
-
-
-
-
-
Всё
-
-
Можно задавать вопросы.
-
-
-
-
-
-
-
-
diff --git a/doc/presentations/group_by/pictures/metrika2.png b/doc/presentations/group_by/pictures/metrika2.png
deleted file mode 100644
index 3ee37e98fc6..00000000000
Binary files a/doc/presentations/group_by/pictures/metrika2.png and /dev/null differ
diff --git a/doc/presentations/group_by/shower/shower.min.js b/doc/presentations/group_by/shower/shower.min.js
deleted file mode 100644
index 449843ac45d..00000000000
--- a/doc/presentations/group_by/shower/shower.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Core for Shower HTML presentation engine
- * shower-core v2.0.7, https://github.com/shower/core
- * @copyright 2010–2016 Vadim Makeev, http://pepelsbey.net/
- * @license MIT
- */
-!function(a){var b,c={NOT_RESOLVED:"NOT_RESOLVED",IN_RESOLVING:"IN_RESOLVING",RESOLVED:"RESOLVED"},d=function(){var l={trackCircularDependencies:!0,allowMultipleDeclarations:!0},m={},n=!1,o=[],p=function(a,d,e){e||(e=d,d=[]);var f=m[a];f||(f=m[a]={name:a,decl:b}),f.decl={name:a,prev:f.decl,fn:e,state:c.NOT_RESOLVED,deps:d,dependents:[],exports:b}},q=function(b,c,d){"string"==typeof b&&(b=[b]),n||(n=!0,k(v)),o.push({deps:b,cb:function(b,f){f?(d||e)(f):c.apply(a,b)}})},r=function(a){var b=m[a];return b?c[b.decl.state]:"NOT_DEFINED"},s=function(a){return!!m[a]},t=function(a){for(var b in a)a.hasOwnProperty(b)&&(l[b]=a[b])},u=function(){var a,b={};for(var c in m)m.hasOwnProperty(c)&&(a=m[c],(b[a.decl.state]||(b[a.decl.state]=[])).push(c));return b},v=function(){n=!1,w()},w=function(){var a,b=o,c=0;for(o=[];a=b[c++];)x(null,a.deps,[],a.cb)},x=function(a,b,c,d){var e=b.length;e||d([]);for(var g,h,i=[],j=function(a,b){if(b)return void d(null,b);if(!--e){for(var c,f=[],g=0;c=i[g++];)f.push(c.exports);d(f)}},k=0,l=e;k ")+'"')},h=function(a){return Error('Declaration of module "'+a.name+'" has already been provided')},i=function(a){return Error('Multiple declarations of module "'+a.name+'" have been detected')},j=function(a,b){for(var c,d=0;c=b[d++];)if(a===c)return!0;return!1},k=function(){var b=[],c=function(a){return 1===b.push(a)},d=function(){var a=b,c=0,d=b.length;for(b=[];c=0&&!b.defaultPrevented();){var d=a[c];d&&(d.context?d.callback.call(d.context,b):d.callback(b)),c--}}}),a(e)}),shower.modules.define("Plugins",["Emitter","util.extend"],function(a,b,c){function d(a){this.events=new b({context:this}),this._showerGlobal=a,this._showerInstances=a.getInited(),this._plugins={},this._instances=[],a.events.on("init",this._onShowerInit,this)}c(d.prototype,{destroy:function(){this._showerGlobal.events.off("init",this._onShowerInit,this),this._plugins=null},add:function(a,b){if(this._plugins.hasOwnProperty(a))throw new Error("Plugin "+a+" already exist.");return this._requireAndAdd({name:a,options:b}),this},remove:function(a){if(!this._plugins.hasOwnProperty(a))throw new Error("Plugin "+a+" not found.");return delete this._plugins[a],this.events.emit("remove",{name:a}),this},get:function(a,b){var c,d=this._plugins[a];if(d&&b)for(var e=0,f=this._instances.length;e=0;e--)if(d[e].getId()===a){b=d[e],c=e;break}return{slide:b,index:c}},_onSlideActivate:function(a){window.location.hash=a.get("slide").getId(),this._setTitle()},_onContainerSlideModeChange:function(){this._setTitle(),this.save()},_isSlideMode:function(){return this._shower.container.isSlideMode()},_onPopstate:function(){var a,b=this._shower,c=window.location.hash.substr(1),d=b.player.getCurrentSlide(),e=b.player.getCurrentSlideIndex();this._isSlideMode()&&e===-1?b.player.go(0):e===-1&&""!==window.location.hash&&b.player.go(0),d&&c!==d.getId()&&(a=this._getSlideById(c),b.player.go(a.index))},_setTitle:function(){var a=document.title,b=this._isSlideMode(),c=this._shower.player.getCurrentSlide();if(b&&c){var d=c.getTitle();document.title=d?d+" — "+this._documentTitle:this._documentTitle}else this._documentTitle!==a&&(document.title=this._documentTitle)}}),a(e)}),shower.modules.define("shower.Player",["Emitter","util.bound","util.extend"],function(a,b,c,d){function e(a){this.events=new b({context:this,parent:a.events}),this._shower=a,this._showerListeners=null,this._playerListeners=null,this._currentSlideNumber=-1,this._currentSlide=null,this.init()}d(e.prototype,{init:function(){this._showerListeners=this._shower.events.group().on("slideadd",this._onSlideAdd,this).on("slideremove",this._onSlideRemove,this).on("slidemodeenter",this._onSlideModeEnter,this),this._playerListeners=this.events.group().on("prev",this._onPrev,this).on("next",this._onNext,this),document.addEventListener("keydown",c(this,"_onKeyDown"))},destroy:function(){this._showerListeners.offAll(),this._playerListeners.offAll(),document.removeEventListener("keydown",c(this,"_onKeyDown")),this._currentSlide=null,this._currentSlideNumber=null,this._shower=null},next:function(){return this.events.emit("next"),this},prev:function(){return this.events.emit("prev"),this},first:function(){return this.go(0),this},last:function(){return this.go(this._shower.getSlidesCount()-1),this},go:function(a){"number"!=typeof a&&(a=this._shower.getSlideIndex(a));var b=this._shower.getSlidesCount(),c=this._currentSlide;return a!=this._currentSlideNumber&&a=0&&(c&&c.isActive()&&c.deactivate(),c=this._shower.get(a),this._currentSlide=c,this._currentSlideNumber=a,c.isActive()||c.activate(),this.events.emit("activate",{index:a,slide:c})),this},getCurrentSlide:function(){return this._currentSlide},getCurrentSlideIndex:function(){return this._currentSlideNumber},_onPrev:function(){this._changeSlide(this._currentSlideNumber-1)},_onNext:function(){this._changeSlide(this._currentSlideNumber+1)},_changeSlide:function(a){this.go(a)},_onSlideAdd:function(a){var b=a.get("slide");b.events.on("activate",this._onSlideActivate,this)},_onSlideRemove:function(a){var b=a.get("slide");b.events.off("activate",this._onSlideActivate,this)},_onSlideActivate:function(a){var b=a.get("slide"),c=this._shower.getSlideIndex(b);this.go(c)},_onKeyDown:function(a){if(this._shower.isHotkeysEnabled()&&!/^(?:button|input|select|textarea)$/i.test(a.target.tagName))switch(this.events.emit("keydown",{event:a}),a.which){case 33:case 38:case 37:case 72:case 75:if(a.altKey||a.ctrlKey||a.metaKey)return;a.preventDefault(),this.prev();break;case 34:case 40:case 39:case 76:case 74:if(a.altKey||a.ctrlKey||a.metaKey)return;a.preventDefault(),this.next();break;case 36:a.preventDefault(),this.first();break;case 35:a.preventDefault(),this.last();break;case 32:this._shower.container.isSlideMode()&&(a.shiftKey?this.prev():this.next())}},_onSlideModeEnter:function(){this._currentSlide||this.go(0)}}),a(e)}),shower.modules.define("shower.slidesParser",["Slide"],function(a,b){function c(a,c){var d=a.querySelectorAll(c);return d=Array.prototype.slice.call(d),d.map(function(a,c){var d=new b(a);return a.id||(a.id=c+1),d})}a(c)}),shower.modules.define("Slide",["shower.defaultOptions","Emitter","Options","slide.Layout","slide.layoutFactory","util.Store","util.extend"],function(a,b,c,d,e,f,g,h){function i(a,b,e){this.events=new c,this.options=new d(b),this.layout=null,this.state=new g({visited:0,index:null},e),this._content=a,this._isVisited=this.state.get("visited")>0,this._isActive=!1,this.init()}h(i.prototype,{init:function(){this.layout="string"==typeof this._content?new f.createLayout({content:this._content}):new e(this._content,this.options),this.layout.setParent(this),this._setupListeners()},destroy:function(){this._clearListeners(),this._isActive=null,this.options=null,this.layout.destroy()},activate:function(){this._isActive=!0;var a=this.state.get("visited");return this.state.set("visited",++a),this.events.emit("activate",{slide:this}),this},deactivate:function(){return this._isActive=!1,this.events.emit("deactivate",{slide:this}),this},isActive:function(){return this._isActive},isVisited:function(){return this.state.get("visited")>0},getTitle:function(){return this.layout.getTitle()},setTitle:function(a){return this.layout.setTitle(a),this},getId:function(){return this.layout.getElement().id},getContent:function(){return this.layout.getContent()},_setupListeners:function(){this.layoutListeners=this.layout.events.group().on("click",this._onSlideClick,this)},_clearListeners:function(){this.layoutListeners.offAll()},_onSlideClick:function(){this.activate(),this.events.emit("click",{slide:this})}}),a(i)}),shower.modules.define("slide.Layout",["Options","shower.defaultOptions","Emitter","util.bound","util.extend"],function(a,b,c,d,e,f){function g(a,e){this.options=new b({title_element_selector:c.slide_title_element_selector,active_classname:c.slide_active_classname,visited_classname:c.slide_visited_classname},e),this.events=new d,this._element=a,this._parent=null,this._parentElement=null,this.init()}f(g.prototype,{init:function(){var a=this._element.parentNode;a?this._parentElement=a:this.setParentElement(a)},destroy:function(){this.setParent(null)},setParent:function(a){this._parent!=a&&(this._clearListeners(),this._parent=a,this._parent&&this._setupListeners(),this.events.emit("parentchange",{parent:a}))},getParent:function(){return this._parent},setParentElement:function(a){a!=this._parentElement&&(this._parentElement=a,a.appendChild(this._element),this.events.emit("parentelementchange",{parentElement:a}))},getParentElement:function(){return this._parentElement},getElement:function(){return this._element},setTitle:function(a){var b=this.options.get("title_element_selector"),c=this._element.querySelector(b);c?c.innerHTML=a:(c=document.createElement(b),c.innerHTML=a,this._element.insertBefore(c,this._element.firstChild))},getTitle:function(){var a=this.options.get("title_element_selector"),b=this._element.querySelector(a);return b?b.textContent:null},getData:function(a){var b=this._element;return b.dataset?b.dataset[a]:b.getAttribute("data-"+a)},getContent:function(){return this._element.innerHTML},_setupListeners:function(){this._slideListeners=this._parent.events.group().on("activate",this._onSlideActivate,this).on("deactivate",this._onSlideDeactivate,this),this._element.addEventListener("click",e(this,"_onSlideClick"),!1)},_clearListeners:function(){this._slideListeners&&this._slideListeners.offAll(),this._element.removeEventListener("click",e(this,"_onSlideClick"))},_onSlideActivate:function(){this._element.classList.add(this.options.get("active_classname"))},_onSlideDeactivate:function(){var a=this._element.classList;a.remove(this.options.get("active_classname")),a.add(this.options.get("visited_classname"))},_onSlideClick:function(){this.events.emit("click")}}),a(g)}),shower.modules.define("slide.layoutFactory",["slide.Layout","util.extend"],function(a,b,c){var d={};c(d,{createLayout:function(a){a=a||{};var e=d._createElement(c({content:"",contentType:"slide"},a));return new b(e)},_createElement:function(a){var b=document.createElement("section");return b.innerHTML=a.content,b.classList.add(a.contentType),b}}),a(d)}),shower.modules.define("util.bound",function(a){function b(a,b){return a["__bound_"+b]||(a["__bound_"+b]=a[b].bind(a))}a(b)}),shower.modules.define("util.extend",function(a){function b(a){if(!a)throw new Error("util.extend: Target not found");return"undefined"==typeof Object.assign?c.apply(null,arguments):Object.assign.apply(null,arguments)}function c(a){for(var b=1,c=arguments.length;b0&&(a.preventDefault(),this.prev())},_go:function(){for(var a=0,b=this._elements.length;awindow.innerWidth/2?c.player.next():c.player.prev()),d||f.activate())},_onTouchMove:function(a){this._shower.container.isSlideMode()&&a.preventDefault()},_getSlideByElement:function(a){for(var b=this._shower.getSlides(),c=null,d=0,e=b.length;d` of your presentation.
-
-## PDF
-
-Ribbon could be exported to PDF by printing it from the list mode in Chrome or Opera browsers. See [printing documentation](https://github.com/shower/shower/blob/master/docs/printing-en.md) for more options.
-
-## Development
-
-If you want to adjust theme for your needs:
-
-1. Fork this repository and clone it to your local machine.
-2. Install dependencies: `npm install`.
-3. Start a local server with watcher: `npm run dev` or just `gulp` if you have it installed globally.
-4. Edit your files and see changes in the opened browser.
-
-To take part in Ribbon development please read [contributing guidelines](CONTRIBUTING.md) first and [file an issue](https://github.com/shower/shower/issues/new) before sending any pull request.
-
----
-Licensed under [MIT License](LICENSE.md).
diff --git a/doc/presentations/group_by/shower/themes/ribbon/index.html b/doc/presentations/group_by/shower/themes/ribbon/index.html
deleted file mode 100644
index 98850917e05..00000000000
--- a/doc/presentations/group_by/shower/themes/ribbon/index.html
+++ /dev/null
@@ -1,304 +0,0 @@
-
-
-
- Ribbon theme for Shower
-
-
-
-
-
-
-
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch letterpress.
-
Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid four loko quinoa.
-
Echo Park 8-bit sustainable umami deep v Kickstarter.
-
-
-
Inline Elements
-
Retro meh brunch aesthetic Cosby sweater Shoreditch. Banksy Tumblr sriracha, flexitarian pug chia master cleanse vinyl wayfarers fanny pack bespoke Helvetica roof party. Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag, leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical <paleo> you probably haven’t heard of.
-
-
-
-
Quotes
-
-
Flannel bicycle rights locavore selfies skateboard. Authentic fanny pack paleo four loko bespoke. Artisan tattooed chia XOXO ennui, lomo disrupt 8-bit art party Tumblr scenester.
Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag.
-
Leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical paleo you probably haven’t heard of.
-
-
-
-
Latin and Cyrillic List Bullets
-
-
Occupy locavore blog, mustache you probably haven't heard of them
Cray pug paleo retro, Echo Park narwhal Wes Anderson
-
Disrupt Williamsburg fixie, shabby chic bicycle rights hashtag kogi
-
-
-
-
Two Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
-
-
-
Three Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch letterpress.
-
Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid four loko quinoa.
-
Echo Park 8-bit sustainable umami deep v Kickstarter.
-
-
-
Inline Elements
-
Retro meh brunch aesthetic Cosby sweater Shoreditch. Banksy Tumblr sriracha, flexitarian pug chia master cleanse vinyl wayfarers fanny pack bespoke Helvetica roof party. Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag, leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical <paleo> you probably haven’t heard of.
-
-
-
-
Quotes
-
-
Flannel bicycle rights locavore selfies skateboard. Authentic fanny pack paleo four loko bespoke. Artisan tattooed chia XOXO ennui, lomo disrupt 8-bit art party Tumblr scenester.
Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag.
-
Leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical paleo you probably haven’t heard of.
-
-
-
-
Latin and Cyrillic List Bullets
-
-
Occupy locavore blog, mustache you probably haven't heard of them
Cray pug paleo retro, Echo Park narwhal Wes Anderson
-
Disrupt Williamsburg fixie, shabby chic bicycle rights hashtag kogi
-
-
-
-
Two Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
-
-
-
Three Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
«ClickHouse is extremely fast at simple SELECTs without joins, much faster than Vertica».
-
-
-
ClickHouse vs. PrestoDB
-
Ömer Osman Koçak:
- «When we evaluated ClickHouse the results were great compared to Prestodb. Even though the columnar storage optimizations for ORC and Clickhouse is quite similar, Clickhouse uses CPU and Memory resources more efficiently (Presto also uses vectorized execution but cannot take advantage of hardware level optimizations such as SIMD instruction sets because it's written in Java so that's fair) so we also wanted to add support for Clickhouse for our open-source analytics platform Rakam (https://github.com/rakam-io/rakam)»
-
-
-
ClickHouse vs. Spark
-
«Я потестировал Clickhouse, по скорости просто отлично = намного быстрее spark на одной машине (у меня получилось порядка 3x, но еще буду сравнивать). Кроме того compression получается лучше».
-
-
-
ClickHouse vs. Google BigQuery
-
«ClickHouse показывает сравнимую скорость на таком запросе за 30 дней и в 8 раз быстрее (!) на таком запросе. В планах есть протестировать и другие запросы, еще не добрались.
Скорость выполнения запросов стабильна. В Google BigQuery в период пиковых нагрузок, например в 4:00 p.m. PDT или в начале месяца, время выполнения запросов может заметно увеличиваться».
-
-
-
ClickHouse vs. Druid
-
«В этом году мы развернули сборку на основе Druid — Imply Analytics Platform, а также Tranquility, и уже приготовились запускать в продакшн… Но после выхода ClickHouse сразу отказались от Druid, хотя потратили два месяца на его изучение и внедрение».
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch letterpress.
-
Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid four loko quinoa.
-
Echo Park 8-bit sustainable umami deep v Kickstarter.
-
-
-
Inline Elements
-
Retro meh brunch aesthetic Cosby sweater Shoreditch. Banksy Tumblr sriracha, flexitarian pug chia master cleanse vinyl wayfarers fanny pack bespoke Helvetica roof party. Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag, leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical <paleo> you probably haven’t heard of.
-
-
-
-
Quotes
-
-
Flannel bicycle rights locavore selfies skateboard. Authentic fanny pack paleo four loko bespoke. Artisan tattooed chia XOXO ennui, lomo disrupt 8-bit art party Tumblr scenester.
Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag.
-
Leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical paleo you probably haven’t heard of.
-
-
-
-
Latin and Cyrillic List Bullets
-
-
Occupy locavore blog, mustache you probably haven't heard of them
Cray pug paleo retro, Echo Park narwhal Wes Anderson
-
Disrupt Williamsburg fixie, shabby chic bicycle rights hashtag kogi
-
-
-
-
Two Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
-
-
-
Three Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
«ClickHouse is extremely fast at simple SELECTs without joins, much faster than Vertica».
-
-
-
ClickHouse vs. PrestoDB
-
Ömer Osman Koçak:
- «When we evaluated ClickHouse the results were great compared to Prestodb. Even though the columnar storage optimizations for ORC and Clickhouse is quite similar, Clickhouse uses CPU and Memory resources more efficiently (Presto also uses vectorized execution but cannot take advantage of hardware level optimizations such as SIMD instruction sets because it's written in Java so that's fair) so we also wanted to add support for Clickhouse for our open-source analytics platform Rakam (https://github.com/rakam-io/rakam)»
-
-
-
ClickHouse vs. Spark
-
«Я потестировал Clickhouse, по скорости просто отлично = намного быстрее spark на одной машине (у меня получилось порядка 3x, но еще буду сравнивать). Кроме того compression получается лучше».
-
-
-
ClickHouse vs. Google BigQuery
-
«ClickHouse показывает сравнимую скорость на таком запросе за 30 дней и в 8 раз быстрее (!) на таком запросе. В планах есть протестировать и другие запросы, еще не добрались.
Скорость выполнения запросов стабильна. В Google BigQuery в период пиковых нагрузок, например в 4:00 p.m. PDT или в начале месяца, время выполнения запросов может заметно увеличиваться».
-
-
-
ClickHouse vs. Druid
-
«В этом году мы развернули сборку на основе Druid — Imply Analytics Platform, а также Tranquility, и уже приготовились запускать в продакшн… Но после выхода ClickHouse сразу отказались от Druid, хотя потратили два месяца на его изучение и внедрение».
I work on data processing engine of Yandex.Metrica since 2008.
-
-
-
The history
-
Yandex.Metrica (https://metrica.yandex.com/) is a service for web analytics.
-
Largest in Russia, second largest in the world (just after Google Analytics).
-
-
We are processing about ~25 billions of events (page views, conversions, etc).
-
We must generate and show reports in realtime.
-
-
-
The old Metrica (RIP 2008–2014)
-
Everything was working fine. User could show about 50 different reports.
-
But there was a problem. We want more than just 50 pre-defined reports. We need to make every report infinitely customizable. The user must be able to slice and dice, and drill down every report from summary up to show single visitors.
-
-
-
The report builder
-
We had quickly made a prototype of so-called "report builder".
-
This was 2010 year. It was just simple specialized column-oriented data structure.
-
It worked fine and we got understanding, what the right direction to go.
-
We need good column-oriented DBMS.
-
-
-
Why column-oriented?
-
This is how "traditional" row-oriented databases work:
-
-
-
-
Why column-oriented?
-
And this is how column-oriented databases work:
-
-
-
-
Why ClickHouse?
-
In 2011 there was nothing suitable in the marked. In fact there is nothing comparable even now.
-
Then we developed ClickHouse.
-
See nice article «Evolution of data structures in Yandex.Metrica»
There was even cases, when single analysts install ClickHouse on their VMs and started to use it without any questions.
-
-
-
Open-source
-
Then we decided — ClickHouse is just too good to be used solely by Yandex.
-
To just have more fun, we need to make more companies and people around the world using ClickHouse, to let them be happy. We decided to be open-source.
-
-
-
Open-source
-
Apache 2.0 licence — very unrestrictive.
-
The goal — maximum widespread of ClickHouse.
-
We want for product by Yandex to be used everywhere.
«ClickHouse is extremely fast at simple SELECTs without joins, much faster than Vertica».
-
-
-
ClickHouse vs. PrestoDB
-
Ömer Osman Koçak:
- «When we evaluated ClickHouse the results were great compared to Prestodb. Even though the columnar storage optimizations for ORC and Clickhouse is quite similar, Clickhouse uses CPU and Memory resources more efficiently (Presto also uses vectorized execution but cannot take advantage of hardware level optimizations such as SIMD instruction sets because it's written in Java so that's fair) so we also wanted to add support for Clickhouse for our open-source analytics platform Rakam (https://github.com/rakam-io/rakam)»
-
-
-
ClickHouse vs. Spark
-
«Я потестировал Clickhouse, по скорости просто отлично = намного быстрее spark на одной машине (у меня получилось порядка 3x, но еще буду сравнивать). Кроме того compression получается лучше».
-
-
-
ClickHouse vs. Google BigQuery
-
«ClickHouse показывает сравнимую скорость на таком запросе за 30 дней и в 8 раз быстрее (!) на таком запросе. В планах есть протестировать и другие запросы, еще не добрались.
Скорость выполнения запросов стабильна. В Google BigQuery в период пиковых нагрузок, например в 4:00 p.m. PDT или в начале месяца, время выполнения запросов может заметно увеличиваться».
-
-
-
ClickHouse vs. Druid
-
«В этом году мы развернули сборку на основе Druid — Imply Analytics Platform, а также Tranquility, и уже приготовились запускать в продакшн… Но после выхода ClickHouse сразу отказались от Druid, хотя потратили два месяца на его изучение и внедрение».
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch letterpress.
-
Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid four loko quinoa.
-
Echo Park 8-bit sustainable umami deep v Kickstarter.
-
-
-
Inline Elements
-
Retro meh brunch aesthetic Cosby sweater Shoreditch. Banksy Tumblr sriracha, flexitarian pug chia master cleanse vinyl wayfarers fanny pack bespoke Helvetica roof party. Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag, leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical <paleo> you probably haven’t heard of.
-
-
-
-
Quotes
-
-
Flannel bicycle rights locavore selfies skateboard. Authentic fanny pack paleo four loko bespoke. Artisan tattooed chia XOXO ennui, lomo disrupt 8-bit art party Tumblr scenester.
Messenger bag retro cred Portland next level. Yr stumptown Schlitz Carles deep v small batch. Hella sustainable messenger bag.
-
Leggings skateboard literally1 bicycle rights H20 mumblecore banh mi DIY VHS. Semiotics four loko street art asymmetrical. Asymmetrical paleo you probably haven’t heard of.
-
-
-
-
Latin and Cyrillic List Bullets
-
-
Occupy locavore blog, mustache you probably haven't heard of them
Cray pug paleo retro, Echo Park narwhal Wes Anderson
-
Disrupt Williamsburg fixie, shabby chic bicycle rights hashtag kogi
-
-
-
-
Two Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.
-
-
-
Three Columns
-
Echo Park 8-bit sustainable umami deep v Kickstarter. DIY cliche typewriter brunch, Odd Future sriracha pickled aesthetic. Farm-to-table bespoke fingerstache, kale chips umami brunch American Apparel letterpress. Whatever authentic disrupt, you probably haven't heard of them direct trade mlkshk Etsy. Gluten-free roof party plaid American Apparel four loko quinoa. Echo Park 8-bit sustainable.