ClickHouse: настоящее и будущее

ClickHouse:
настоящее и будущее

Я расскажу:

— почему ClickHouse — хорошая система;

— почему ClickHouse — плохая система;

— и что с этим делать.

Impala Spark SQL Presto/Trino Drill Hawq Actian Vortex Kylin Kudu MonetDB Vectorwise Actian Vector Actian Matrix Redshift Snowflake Citus Greenplum OmniSci (mapD) Brytlyt HyPER Druid Pinot kdb+ Shakti jd MariaDB CS Exasol MemSQL (SingleStore) Vertica SAP HANA Teradata Sybase IQ MS SQL with CS index Oracle Exadata IBM Netezza, IBM BLU TiDB

ClickHouse — хорошая система

ClickHouse не тормозит

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

Разработана «снизу-вверх» исходя из конкретных сценариев.

Внимание к деталям и специализация под сценарии нагрузки.

Доклад «секреты оптимизации производительности ClickHouse»
https://www.youtube.com/watch?v=ltg8vstuHUU

ClickHouse — надёжная система

— кросс-ДЦ master-master репликация;

— надёжная запись и хранение данных;

— защита от сбоев железа;

— защита от ошибок пользователя;

— защита от ошибок конфигурации;

— шифрование трафика и хранимых данных, аутентификация;

— все доступные средства тестирования в CI;

ClickHouse — удобная система

Язык SQL, адаптированный для удобства аналитики:

— алиасы в любом месте запроса;
— массивы, кортежи, лямбда функции;
— комбинаторы агрегатных функций;
— LIMIT BY, ASOF JOIN, ANY/SEMI JOIN, argMin/argMax;

Функции для предметной области из коробки:

— click-stream: функции обработки URL и IP-адресов.
— performance monitoring: квантили;
— geospatial: geoDistance, pointInPolygon, H3, S2;

ClickHouse — гибкая система

Web analytics.Mobile app analytics. Ads analytics.Realtime bidding. E-commerce analytics.Retail. Games analytics.Video streaming analytics. Media & news analytics. Social recommendations.Classifieds. Dating. Search engine optimization. Telecom traffic analysis.DPI analysis. CDR records analysis. Fraud & spam detection.DDoS protection. Application performance monitoring.Logs & metrics. Security events and logs. SIEM.Analytics of corporate networks. Telemetry.Industrial monitoring.Sensor data.IoT.Self-driving cars.Agriculture. Smart cities, surveillance.Delivery.Taxi.Food tech.HoReCa. Scientific datasets.Genomics.Particle physics.Astronomy & astrophysics.Econometrics. ML feature analytics and research. Trading & financial data.Fintech.Insurance. Investment banking.Blockchain. Gambling.Adult. Business intelligence.

ClickHouse — доступная система

ClickHouse можно развернуть:

— на своих серверах;
— в облаках; с Kubernetes;
— на инфраструктуре заказчика;
— на личном ноутбуке.

ClickHouse доступен под разные платформы:

— x86_64, aarch64 (ARM), PowerPC 64, RISC-V;
— Linux, FreeBSD, mac OS.

ClickHouse — настоящий open-source

Исходники доступны публично.

Патчи от сообщества принимаются.

Открытые процессы разработки.

Низкий порог входа для контрибьюторов.

Максимальное поощрение и вовлечение сообщества.

Доклад «как организовать живое сообщество вокруг open-source продукта»
https://www.youtube.com/watch?v=xddKLojmkus&t=4165s

ClickHouse — плохая* система

* — не идеальная.

Репликация требует ZooKeeper

ZooKeeper — отдельный от ClickHouse компонент,
написанный на Java, требующий тщательной настройки
и отдельных серверов.

ZooKeeper уходит!

1. clickhouse-keeper — 100% совместимый с ZooKeeper
по протоколу и модели данных.

— compressed logs and snapshots;
— no issues with zxid overflow;
— no issues with large packets;
— better memory usage;
— no issues with GC and Java heap;

2. Может запускаться встроенным в clickhouse-server.

— нет необходимости в отдельном сервисе;

Разработчик: Alexander Sapin.

Данные необходимо вставлять пачками

Можно вставлять миллионы строк в секунду на каждый сервер.

Но эти строки должны быть всего лишь в нескольких пачках в секунду.

Можно использовать Kafka или RabbitMQ таблицы.

Асинхронные INSERT запросы

Возможность делать много частых INSERT.

Из множества параллельных соединений.

Без Kafka и без Buffer таблиц!

Множество мелких INSERTs комбинируются вместе
в одну пачку в оперативной памяти.

Вставки надёжные по-умолчанию:
клиент получает ответ, когда данные записаны в таблицу.

Уже в продакшене! Разработчики: Anton Popov, Ivan Lezhankin.

Отсутствие поддержки транзакций

Зачем в ClickHouse транзакции?

— для атомарной вставки в несколько таблиц и представлений.

— для атомарной вставки на кластер.

— для выполнения множества SELECT из одного снапшота.

В разработке, запланировано на Q2 2022.

Недостаточная совместимость SQL

Язык SQL в ClickHouse изначально сделан нестандартным для удобства.

Из-за сложного механизма разрешения имён и типов,
запросы сложно анализировать.

Есть способ поддержать все возможности стандарта
и сохранить все расширения ClickHouse!

2021: Window Functions, ANY/ALL, EXISTS, GROUPING SETS...

2022: Correlated Subqueries

Отсутствие оптимизаций JOIN

Не учитывается сортировка таблицы для JOIN.

Нет cost based optimizer для переупорядочивания JOIN.

Нет grace hash алгоритма для JOIN.

Нет shuffle для распределённых JOIN.

И вообще распределённые JOIN плохо работают.

Отсутствие UPSERT

Отсутствие точечных UPDATE и DELETE,
а также UNIQUE KEY CONSTRAINT.

Реализовать unique key в распределённой системе
— нетривиальная задача.

Сложность масштабирования

ClickHouse прекрасно масштабируется
до тысяч серверов и 100 ПБ данных.

Но изменение числа серверов в кластере — боль.

Нужно заботиться о конфигурации шардов и реплик.

Перешардирование данных осуществляется вручную.

Решение — cloud-native ClickHouse.

Кстати, а что это значит?

Сложность разделения ресурсов

Разделение CPU и IO между запросами.

Приоритеты запросов.

Memory overcommit.

Недостаточные возможности по интеграции

Нет родного UI для ClickHouse

Не хватает официальных интеграций с BI и ETL.

Недостаточная известность в США и Европе

Недостаточно развитая документация.

Отсутствие обучающих материалов, курсов и поддержки.

И что с этим делать?

Компания ClickHouse, Inc

Создана вместе с Яндексом.

Уже привлекли 300 млн $ при оценке 2 млрд.

Направления работы ClickHouse Inc

  1. Создать облачный сервис для ClickHouse
    в serverless формате с динамическим масштабированием.
  2. Развитие и поддержка ClickHouse в open-source
    с целью увеличения размера рынка ClickHouse.
  3. Исследования и эксперименты
    для поиска новых ниш и возможностей ClickHouse.

Новые горизонты для ClickHouse

Поддержка полуструктурированных данных.
Функции обработки текста на естественном языке.
Потоковые запросы и complex event processing.
Key-value витрины данных, инкрементальная агрегация в оперативке.
Выполнение запросов с использованием GPU.
Интеграция с ML & AI.
Обработка графов.
Batch jobs.
Data Hub.

Support For Semistructured Data

JSON data type:

CREATE TABLE games (data JSON) ENGINE = MergeTree;

You can insert arbitrary nested JSONs.

Types are automatically inferred on INSERT and merge.

Data is stored in columnar format: columns and subcolumns.

Query nested data naturally.

Support For Semistructured Data

Example: NBA games dataset

CREATE TABLE games (data String) ENGINE = MergeTree ORDER BY tuple(); SELECT JSONExtractString(data, 'teams', 1, 'name') FROM games;

— 0.520 sec.

CREATE TABLE games (data JSON) ENGINE = MergeTree; SELECT data.teams.name[1] FROM games;

— 0.015 sec.

Support For Semistructured Data

DESCRIBE TABLE games SETTINGS describe_extend_object_types = 1 name: data type: Tuple( <-- inferred type `_id.$oid` String, `date.$date` String, `teams.abbreviation` Array(String), `teams.city` Array(String), `teams.home` Array(UInt8), `teams.name` Array(String), `teams.players.ast` Array(Array(Int8)), `teams.players.blk` Array(Array(Int8)), `teams.players.drb` Array(Array(Int8)), `teams.players.fg` Array(Array(Int8)), `teams.players.fg3` Array(Array(Int8)), `teams.players.fg3_pct` Array(Array(String)), `teams.players.fg3a` Array(Array(Int8)), `teams.players.fg_pct` Array(Array(String)), `teams.players.fga` Array(Array(Int8)), `teams.players.ft` Array(Array(Int8)), `teams.players.ft_pct` Array(Array(String)), `teams.players.fta` Array(Array(Int8)), `teams.players.mp` Array(Array(String)), `teams.players.orb` Array(Array(Int8)), `teams.players.pf` Array(Array(Int8)), `teams.players.player` Array(Array(String)), `teams.players.plus_minus` Array(Array(String)), `teams.players.pts` Array(Array(Int8)), `teams.players.stl` Array(Array(Int8)), `teams.players.tov` Array(Array(Int8)), `teams.players.trb` Array(Array(Int8)), `teams.results.ast` Array(Int8), `teams.results.blk` Array(Int8), `teams.results.drb` Array(Int8), `teams.results.fg` Array(Int8), `teams.results.fg3` Array(Int8), `teams.results.fg3_pct` Array(String), `teams.results.fg3a` Array(Int8), `teams.results.fg_pct` Array(String), `teams.results.fga` Array(Int16), `teams.results.ft` Array(Int8), `teams.results.ft_pct` Array(String), `teams.results.fta` Array(Int8), `teams.results.mp` Array(Int16), `teams.results.orb` Array(Int8), `teams.results.pf` Array(Int8), `teams.results.plus_minus` Array(String), `teams.results.pts` Array(Int16), `teams.results.stl` Array(Int8), `teams.results.tov` Array(Int8), `teams.results.trb` Array(Int8), `teams.score` Array(Int16), `teams.won` Array(Int8))

Support For Semistructured Data

Flexible schema.

You can have columns with strict and flexible schema in one table.

Queries work as fast as with predefined types!

Planned for Q1 2022.
Developer: Anton Popov.

Выводы

Вместе с новой компанией и open-source сообществом
мы сделаем ClickHouse лучшей аналитической СУБД в мире!