Потрясающие возможности ClickHouse

ClickHouse Meetup онлайн

YouTube трансляция: https://www.youtube.com/c/ClickHouseDB

Telegram chat: https://telegram.me/clickhouse_ru, clickhouse_en

Футболки за вопросы!

Если вы задали вопрос через Zoom
— напишите после мероприятия мне в Telegram в личку:
свой вопрос, размер футболки и адрес для доставки курьером.

Возможности ClickHouse:
весна/лето 2020

Прореживание и агрегация старых данных

... с помощью TTL выражений.
Вы уже знакомы с TTL выражениями?

CREATE TABLE (d Date, ip IPv4 TTL d + INTERVAL 1 MONTH, ...) ENGINE = MergeTree ... CREATE TABLE t (d Date, ...) ENGINE = MergeTree ... TTL d + INTERVAL 1 MONTH TTL d + INTERVAL 1 MONTH DELETE TTL d + INTERVAL 1 MONTH TO DISK disk_name TTL d + INTERVAL 1 MONTH TO VOLUME volume_name

Прореживание и агрегация старых данных

... с помощью TTL выражений.

Прореживание:

TTL d + INTERVAL 1 MONTH DELETE WHERE is_yandex = 0

Агрегация:

CREATE TABLE t (d Date, a UInt64, b String, c String... ENGINE = MergeTree ORDER BY (a, b, c) TTL d + INTERVAL 1 MONTH GROUP BY a, b SET x = sum(x), y = quantile(0.9)(y)

a, b - префикс ключа сортировки

Прореживание и агрегация старых данных

Агрегация:

CREATE TABLE t (d Date, a UInt64, b String, c String... ENGINE = MergeTree ORDER BY (a, b, c) TTL d + INTERVAL 1 MONTH GROUP BY a, b SET x = sum(x), y = quantile(0.9)(y)

— GROUP BY по префиксу ключа сортировки;

— агрегатные функции можно вычислять
от любой комбинации столбцов: SET x = argMax(x, time);

— если выражение SET для столбца
не задано — эквивалентно SET x = any(x);

— пока нельзя: комбинировать WHERE и GROUP BY.

Прореживание и агрегация старых данных

... с помощью TTL выражений.

Хорошо подходит для временных рядов
— загрубление старых данных.

Похоже на GraphiteMergeTree,
но применимо для всех MergeTree таблиц.

Похоже на AggregatingMergeTree и SummingMergeTree,
но с порогами на время до агрегации.

Доступно в версии 20.5. Разработчик — Николай Сорокин.

Географические функции и словари

Вспоминаем про pointInPolygon...

demo

Географические словари

Задача reverse geocoding:

— поиск полигона по координатам;

— найти самый маленький полигон,
  вернуть его свойства;

— среди множеств (миллионов) полигонов;

— с разумной скоростью
  и потреблением памяти;

Географические словари

CREATE DICTIONARY polygon_dict ( key Array(Array(Array(Array(Float64)))), name String, value UInt64 ) PRIMARY KEY key SOURCE(...) LAYOUT(POLYGON_INDEX_CELL())

key - мульти-полигон:
Array(Float64) - пара координат, также можно Tuple(Float64, Float64);
Array(Array(Float64)) - кольцо (ring);
Array(Array(Array(Float64))) - полигон с дырками;
Array(Array(Array(Array(Float64)))) - мульти-полигон.

Географические словари

SELECT dictGet('polygon_dict', 'name', (x, y))

Производительность:

Границы районов России (20 000 штук, 12 млн. точек)
из OpenStreetMap.

— 2 GB оперативки;
— загрузка - 2.5 минуты;
— скорость 900 000 lookups/sec * количество ядер CPU.

Неконстантные полигоны в pointInPolygon:
Доступно в версии 20.5. Разработчики — Алексей Илюхов, Алексей Коряков.

Словари полигонов:
Ожидается в версии 20.6. Разработчики — Андрей Чулков, Антон Кваша, Артур Петуховский.

Интерфейсы ClickHouse

— Native

— HTTP

  — ODBC

  — JDBC

— MySQL

— ???

Интерфейсы ClickHouse

— Native

— HTTP

  — ODBC

  — JDBC

— MySQL

— PostgreSQL!

PostgreSQL интерфейс в ClickHouse

Проверена работа с psql и JDBC драйвером Postgres.

Работает и на чтение и на запись.

Не поддерживается:
extended query (параметризованные запросы) и COPY.

demo

Ожидается в версии 20.6. Разработчик — Мовсес Элбакян.

Интерфейсы ClickHouse

— Native

— HTTP

  — ODBC

  — JDBC

— MySQL — 19.8

— PostgreSQL — 20.6

— GRPC — прототип, разрабатывается

Форматы

Apache Arrow

ORC на чтение и на запись

MsgPack, Regexp, Markdown, JSONAsString...

Какой формат реализовать завтра?

Apache Arrow:
Доступно в версии 20.5. Разработчики — Жанна Зосимова, hczhcz.

MsgPack, Regexp, Markdown:
Доступно в версии 20.4. Разработчик — Павел Круглов.

JSONAsString, ORC output:
Доступно в версии 20.5. Разработчик — Павел Круглов.

Словари

Источник MongoDB

Источник Redis

Источник Cassandra — 20.5

Layout "direct" и "complex_key_direct" — 20.5

Настройки форматов для словарей — 20.4

CREATE DICTIONARY ... SETTINGS format_csv_delimiter = '|'

+ настройки форматов для Kafka таблиц — 20.5

Кэширующие словари на SSD

Пример проблемы:

Большой постоянно обновляемый
справочник баннеров в MySQL (~10 млрд. строк).

Если использовать cache-словари, то размера кэша не хватает
и идёт слишком много запросов в MySQL.

Решение:

Гибридная структура данных — оперативка + SSD.
В оперативке 16 байт на ключ + буфер свежих данных.

Все данные всё-равно не помещаются в кэш...
но теперь hit rate примерно 100% и всё быстро.

Ожидается в версии 20.6. Разработчик — Никита Васильев.

Интеграции

Запись в ODBC и JDBC таблицы

SELECT * FROM odbc('DSN', table); INSERT INTO TABLE FUNCTION odbc('DSN', table);

Доступно в версии 20.5. Разработчик — Артемий Бобровский.

Табличная функция mongo

Стриминг из RabbitMQ

Репликация из MySQL

Оптимизации

GROUP BY и DISTINCT по сортированным данным

demo

Доступно в версии 20.5. Разработчик — Дмитрий Рубашкин.

Оптимизации

Распараллеливание FINAL.

Оптимизации сортировок.

Использование оперативки при двухуровневой агрегации.

Параллельный и распределённый INSERT SELECT.

Совместимость с SQL

NULL в CREATE TABLE. Синонимы типов (20.5):

SET data_type_default_nullable = 1;

CREATE TEMPORARY TABLE test ( x INT NULL, y VARCHAR(255) NOT NULL, z BLOB);

Сравнение любых типов со строковыми константами (20.5):

SELECT ... FROM table WHERE x = '1'

Сохранение Nullable при CAST (20.6):

SELECT toTypeName(x), toTypeName(CAST(x AS FLOAT)); Nullable(UInt8) Nullable(Float32)

Совместимость с SQL

Агрегатные функции count / count distinct / uniq от NULL. (20.5)

SELECT COUNT(DISTINCT x) FROM (SELECT NULL AS x) 0

Сравнение String и FixedString с padding: (20.4)

SELECT 'x' = CAST('x' AS FixedString(10))

Операторы DATE и TIMESTAMP (20.4):

SELECT DATE '2020-06-18'

Ещё фичи

Отказ от leader election при репликации.
Distributed over Distributed.
Метрики perf events.

Куски данных в оперативке и WAL.
Opt-in отправка ошибок в Sentry.
Агрегатные функции для статистических тестов.
Типы Decimal256, Decimal512, Float16.
Поиск полудубликатов текстов.
Поддержка OpenTracing.

Публичный roadmap 2020!

https://clickhouse.tech/docs/ru/whats-new/extended-roadmap/

~ 500 задач с подробным описанием — зависимости, исполнители...

.