ClickHouse, весна 2021

ClickHouse Meetup онлайн

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

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

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

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

Возможности ClickHouse, весна 2021

В предыдущих сериях: осень/зима 2020

EXPLAIN queries Compact and In-memory data parts PostgreSQL wire protocol LDAP authentication Atomic database Background data recompression Column transformers RabbitMQ integration 256 bit Decimal Kerberos for Kafka and HDFS Query obfuscation and normalization Embedded Web UI

Если вы пропустили...

Улучшения внешних словарей — Максим Кита.

Родная интеграция с PostgreSQL — Ксения Сумарокова.

Реплицированные базы данных — Александр Токмаков.

Протокол GRPC

Включите в конфиге: <grpc_port>9100</grpc_port>.

Доступны все возможности родного протокола:

— TLS, compression, query progress,
  query cancellation, sessions, external data...

Пример: clickhouse-client с помощью GRPC на Python.

utils/grpc-client/clickhouse-grpc-client.py

Разработчик — Виталий Баранов. Доступно с версии 21.1.

Хеджированные запросы

Позволяет отправить запрос на другую реплику,
если одна из реплик долго отвечает,
и выбрать из нескольких реплик самую быструю.

— для избавления от tail latencies на очень больших кластерах.

Доступно с версии 21.3.

* Самый большой ClickHouse кластер в Яндексе — >630 серверов,
но в других компаниях есть кластера намного больше.

Разработчик — Павел Круглов и Николай Кочетов.

Поддержка OpenTelemetry

Для трассировки ClickHouse запросов в рамках большой инфраструктуры:

— включено по-умолчанию;

— понимает HTTP заголовки opentelemetry;

— множество spans уже размечено внутри ClickHouse;

— данные записываются в system.opentelemetry_log;

Разработчик — Александр Кузьменков. Доступно с версии 20.11.

Форматы сжатия для импорта и экспорта

Прозрачная работа со сжатыми файлами:

— gz, brotli;
— xz, zstd;

Example:

CREATE TABLE github_events_url
(
...
) ENGINE = URL(
  'https://datasets.clickhouse.tech/github_events_v2.native.xz',
  Native);

Разработчик — Аби Палагашвили. Доступно с версии 21.1.

Улучшения совместимости SQL

— UNION DISTINCT;

— REPLACE TABLE and CREATE OR REPLACE TABLE;

— aggregate_functions_null_for_empty;

— Extended CTE;

— Type cast for IN subquery;

— SHOW [CHANGED] SETTINGS;

— POSITION(needle IN haystack);

— DIV / MOD;

— SELECT ALL;

ANTLR грамматика

— экспериментальная и неполная;

— поможет в разработке сторонних инструментов,
  работающих с ClickHouse запросами;

Например: подсветка синтаксиса в редакторе кода.

Разработчик — Иван Лежанкин. Доступно с версии 21.1.

Тип данных Map

Example: map Map(String, String)

SELECT map['hello']

Разработчик — Hexiaoting.

Движок таблиц EmbeddedRocksDB

— для key-value запросов;

— идеально как источник для словаря;

Разработчик — Sundy Li.

Улучшения ALTER

ALTER UPDATE / DELETE IN PARTITION:

— ограничение области мутаций.

ALTER DROP PART:

— теперь и для Replicated таблиц.

TTL теперь удаляет пустые куски:

— нет путаницы с оставшимися кусками.

Поиск полудубликатов текстов

Анализ текстов с помощью алгоритмов Min-Hash и Sim-Hash
для поиска похожих или скопированных кусков.

Алгоритм Min-Hash:

1. Достаём из текста все шинглы из N идущих подряд слов.

2. Хэшируем шинглы!

3. Выбираем M хэшей с мин. значениями и столько же с макс.

4. Хэшируем хэши!

5. Тексты считаются дубликатами, если хотя бы один из двух хэшей совпал.

Разработчик — ucasFL. Доступно с версии 21.1.

Статистические тесты

Тесты на то, что у распределений отличаются средние,
полезно для A/B тестирования.

— studentTTest;

— welchTTest;

— mannWitneyUTest;


Корреляция рангов:

— rankCorr.

Разработчик — Никита Михайлов и другие. Доступно с версии 21.1.

Весна/лето 2021

ClickHouse Roadmap публично доступен на GitHub:

https://github.com/ClickHouse/ClickHouse/issues/17623

Там слишком много... я расскажу только чуть-чуть.

Основные задачи

Provide alternative for ZooKeeper Nested and semistructured data Limited support for transactions Backups Hedged requests Window functions Separation of storage and compute Short-circuit evaluation Projections Lightweight DELETE/UPDATE Workload management User Defined Functions Simplify replication JOIN improvements Embedded documentation Pluggable auth with tokens

https://github.com/ClickHouse/ClickHouse/issues/17623

Window Functions

В разработке. Начальная поддержка в версии 21.1.

SET allow_experimental_window_functions = 1

Уже в релизе:
— OVER (PARTITION BY ... ORDER BY ...)
— aggregate functions over windows;
— WINDOW clause; — frame specifications;

В разработке:
— non-aggregate window functions (rank, etc...);

Разработчик — Александр Кузьменков.

Вложенные и полуструктурированные данные

В разработке. Начальная поддержка в версии 21.1.

Множественная вложенность:

cart Nested(
    item_id UInt64,
    item_price Decimal(20, 5),
    features Nested(
        ...))

SELECT cart.item_id, cart.features.f1 FROM table

SELECT cart.* FROM table

Поддержка для вложенного JSON и Protobuf.

Разработчик — Антон Попов. Доступно с версии 21.1.

Проекции: Разработчик — Amos Bird.

Множественные представления данных в одной таблице.

— разные ключи сортировки;
— подмножество столбцов;
— подмножество строк;
— предагрегации.

В ревью.

Отличия от материализованных представлений:

— данные в проекциях гарантированно консистентны;
— обновляются атомарно с таблицей;
— реплицируются так же, как таблица;
— лучшие проекции автоматически выбираются для SELECT.

Альтернатива для ZooKeeper

В разработке.
— реализован сетевой протокол ZooKeeper;
— используется абстракция поверх ZooKeeper;
— реализована модель данных ZooKeeper;
— TestKeeperServer: сервер с моделью данных ZooKeeper для тестов;
— NuKeeperServer: сервер с распределённым консенсусом на RAFT;
— реализованы снапшоты, логи, восстановление после сбоя;

Преимущества:
— более простая эксплуатация;
— исправление "zxid overflow";
— исправление проблем с max packet size;
— исправление "session expired" из-за пауз GC;
— уменьшение потребления памяти;
— сжатые снапшоты и логи;
— встраивание в clickhouse-server.

Разработчик — Александр Сапин.

Short-circuit выполнение выражений

SELECT IF(number = 0, 0, 123 % number) FROM numbers(10)

— division by zero.

SELECT * FROM numbers(10) WHERE number > 0 AND 10 % number > 0

— division by zero.

— всегда выполняются обе ветки IF, AND и OR.

SELECT * FROM
(
    SELECT * FROM numbers(10)
    WHERE number > 0
)
WHERE 10 % number > 0

— division by zero.

User Defined Functions

Рассматриваем 5 способов реализации UDF, из них два обязательны:

1. UDF в виде SQL выражений.

CREATE FUNCTION f AS x -> x + 1

2. UDF как исполняемая программа.

Взаимодействие через пайпы, данные сериализуются в любом формате.

Поддержка очень частых вставок

Что будет, если отправлять в ClickHouse INSERT-ы по одной строке?

Было: ничего хорошего.
— нужно было буферизировать данные самому, или пользоваться Kafka, или ставить clickhouse-bulk, kittenhouse, ...

Будет: всё хорошо.
— ClickHouse сам будет собирать данные в пачки и выполнять асинхронный INSERT.

Новые версии ClickHouse

21.4 — testing.

21.3 — prestable, LTS до 2022-03-01.

21.2 — stable.

21.1 — stable.

20.12 — stable.

20.12 ... 20.9 — obsolete.

20.8 — LTS до 2021-09-30.

...

20.3 — obsolete.

?

Публичный roadmap 2021:

https://github.com/ClickHouse/ClickHouse/issues/17623

.