Инфраструктура для Data-Engineer ClickHouse

b30c2309a6d966882238be3b869931f4.png

В этой статье я хочу показать как можно использовать ClickHouse в дата-инженерии и как его »пощупать».

Я не хотел бы повторяться, поэтому большую часть информации про ClickHouse вы можете узнать из видео ниже:

  • Строго рекомендую к просмотру данное видео в нем рассматривается вся архитектура ClickHouse. Множество фишек и прочих тонкостей. Не обращайте внимание, что видео старое, оно до сих пор актуальное, потому что архитектуру ClickHouse не изменяют уже много лет.

  • Данное видео рекомендую смотреть после первого. Здесь какие-то вещи повторяются или рассказываются по-другому. Но в любом случае данное видео поможет лучше разобраться как работать с ClickHouse.

  • И для более глубокого понимания данной технологии рекомендую ознакомиться с видео Эффективное использование ClickHouse / Алексей Миловидов (Яндекс)

Весь дальнейший код будет доступен в моём репозитории.

Разворачивание сервиса

В начале создадим docker-compose.yaml со следующим кодом:

services:  
  
  ch_server:  
    image: clickhouse/clickhouse-server:24.8.4  
    ports:  
      - "8123:8123"  
    environment:  
      CLICKHOUSE_USER: click  
      CLICKHOUSE_PASSWORD: click

Затем в терминале выполните команду: docker-compose up -d.

И после этого вы сможете подключиться к ClickHouse со следующими параметрами:

  • host: localhost

  • port: 8123

  • user: click

  • password: click

Я для подключения буду использовать DBeaver.

Но вы можете использовать сторонние клиенты для подключения.

Ранее ClickHouse поддерживал свой клиент, а сейчас они предлагают использовать решения от сторонних разработчиков.

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

Возможности ClickHouse

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

ClickHouse является специфической базой данных.
ClickHouse направлен больше на OLAP-задачи.

Я хотел бы здесь отметить, что чтобы называть ClickHouse СУБД он должен поддерживать »стандарт SQL». О чем это говорит?

Это говорит о том, что некоторые вещи в ClickHouse реализованы, чтобы поддерживать »стандарт SQL»; к примеру UPDATE, DELETE.

Когда вы в дальнейшем будете изучать ClickHouse, то ни раз увидите предложения по типу:»не рекомендуется использовать UPDATE». И так будет по многим пунктам.

Но это не говорит о том, что это Нельзя использовать, просто есть некоторые ограничения.

Также стоит отметить, что на каждую »стандартную» команду в SQL у ClickHouse есть своя имплементация. Как пример: не стоит использовать »классические» оконные функции в ClickHouse, а стоит воспользоваться массивами и так далее.

Columns VS rows

Для каждой задачи — свой инструмент. Поэтому для аналитических задач стоит использовать БД оптимизированными под OLAP нагрузку.

Если говорить на примерах, то при OLAP и OLTP у нас разные задачи.

При OLTP задачах нам необходимо искать данные точечно, по определённому полю (пользователь, какое-то событие и пр.).

При OLAP задачах мы хотим смотреть на картину в общем. Поэтому мы не смотрим на конкретное поле, а смотрим на выборку полей (по диапазону, по конкретному условию и пр.)

Есть хороший пример, который я когда-то услышал: представьте что вы лесник и вам необходимо найти конкретное дерево, к примеру конкретную берёзу. Вам это необходимо, чтобы проверить её состояние и актуализировать у себя в базе данных — для таких задач хорошо подойдет OLTP СУБД (PostgreSQL, MySQL, etc)

А если вы хотите посмотреть общее состояние леса: сколько больных деревьев, сколько у вас берёз, ёлок или какая средняя высота леса, то вы уже смотрите на свой лес в общем, а не на конкретное дерево и для таких задач подойдут OLAP СУБД (ClickHouse, GreenPlum, etc)

И чтобы удовлетворять потребности OLAP нагрузки ClickHouse использует Column-oriented хранение данных.

О преимуществах данного подхода рассказано в видео выше и также на сайте ClickHouse есть хорошая визуализация, которая показывает наглядно все преимущества разных подходов.

Engines

Одним из преимуществ ClickHouse — это создание таблиц с разными движками.

Движки в ClickHouse помогают реализовать определённую логику без написания собственных велосипедов.

Ниже мы рассмотрим пару примеров, которые могут встретиться чаще всего на вашей практике:

  • MergeTree — самый частый и самый »базовый» движок для создания таблиц в ClickHouse. Обеспечивает быструю вставку, поддерживает большие объёмы данных и все преимущества ClickHouse можно рассматривать на данном движке.

  • ReplacingMergeTree — по моему мнению второй по частоте движок, потому что он позволяет »схлапывать» значения по ключу сортировки.

    Данный движок позволяет исключить задубливание значений по ключу сортировки и держать таблицу всегда в »актуальном» состоянии.

    Здесь сразу стоит отметить, что »схлапывание» происходит по внутренней логике ClickHouse. Оно может произойти мгновенно или через какое-то время. Всё зависит от количества вставленных данных и объёма самой таблицы.

    При работе с такой таблицей можно использовать ключевое слово FINAL и тогда он »схлопнет» значения во время выполнения запроса. Но это не рекомендуется делать, потому что это создаёт лишнюю нагрузку на БД и не »схлапывает» значения в самой таблице.

    Также можно самостоятельно выполнить операцию »схлапывания» командой OPTIMIZE TABLE table_name FINAL. Но и это не рекомендуется делать. Я рекомендую такие операции оставить самому ClickHouse.

Более подробно о всех движках и их возможностях описано в документации.

Помимо движков самого ClickHouse он имеет ряд движков для работы с другими СУБД. Не стоит о них забывать, потому что благодаря им вы сможете подключиться к различным БД и объединять данные для своих задачах.

MPP

MPP (Massive Parallel Processing) — этот термин вы можете часто встретить в разных статьях/докладах/видео, которые посвящены обработке данных. Это популярный подход, который позволяет распределить вычисления между несколькими исполнителями.

Давайте разбираться по порядку. Во-первых стоит понять, что такое Shard. О нём более подробно описано тут.

Если говорить на примерах, то Shard позволяет распределить нагрузку. Если мы возьмём типовую задачу — посчитать средний чек за весь период, то одна »машина» (компьютер, сервер) могут не справиться с нагрузкой и поэтому мы можем добавить ещё один Shard в наш ClickHouse и теперь нагрузка при выполнении аналитических запросов распределится между Shard и позволит выполнить запрос быстрее.

Важно: При работе с несколькими Shard стоит правильно выбирать ключ сортировки (ключ распределения). Если вы выберете не верный ключ сортировки, то увеличение Shard не ускорит ваши запросы, а может даже замедлить. Больше тонкостей описано в документации.

Стоит также знать и понимать, что такое Replica. С определением можете ознакомиться в документации. Но если упрощать, то Replica позволяет сделать копию данных и вы сможете переключиться на неё, если у вас будут проблемы с каким-то Shard.

MATERIALIZED VIEW

Здесь я хотел бы только отметить, что MATERIALIZED VIEW в ClickHouse работают не самым привычным образом. Если вы привыкли работать с MATERIALIZED VIEW в PostgreSQL, то здесь логика немного другая.

Основная логика работы MATERIALIZED VIEW в ClickHouse — это автообновление заложенных расчётов. Соответственно если вы совершаете вставку данных в »основную» таблицу, на основании которой сделано MATERIALIZED VIEW, то после вставки ваша MATERIALIZED VIEW будет обновлена автоматически.

Более подробно описано в документации.

Dictionary

Мощный инструмент в ClickHouse, с которым точно нужно познакомиться — это словари. Это один из движков таблицы, которые позволяют создать в ClickHouse хэш-таблицу (ключ-значение).

Благодаря чему скорость выполнения запросов может вырасти. С примерами реализации вы можете ознакомиться в документации.

При создании словарей я бы руководствовался советами самого ClickHouse:

Use smaller datasets on the right side of JOIN: This query may seem more verbose than is required, with the filtering on PostIds occurring in both the outer and sub queries. This is a performance optimization which ensures the query response time is fast. For optimal performance, always ensure the right side of the JOIN is the smaller set and as small as possible. For tips on optimizing JOIN performance and understanding the algorithms available, we recommend this series of blog articles.

Также словари можно создавать из внешних источников (S3, PostgreSQL, etc). Благодаря такой возможности можно создавать словари с »маленькими» и часто используемыми таблицами.

Мы можем не переносить все таблицы из S3/PostgreSQL/etc, а использовать словари, который нам обеспечат скорость получения данных и оптимизацию нагрузки на источник и ClickHouse.

S3

В ClickHouse также реализован хороший интерфейс для взаимодействия с S3. О всех возможностях интеграции S3 в ClickHouse описано в документации.

Если вы хотите попробовать S3 + ClickHouse, то можете воспользоваться моей статьей Инфраструктура для data engineer S3. Она поможет вам интегрировать S3 в ваш проект.

Kafka

Если вы не знаете, что такое Kafka, то рекомендую ознакомиться с моей статьей Инфраструктура для data engineer Kafka.

Как по мне использование ClickHouse для интеграции Kafka — это один из самых простых вариантов. Минимум действий и результат виден сразу. Пример интеграции Kafka + ClickHouse представлен в моей статье CDC на примитивах.

Но если вы не хотите читать мои материалы, но хотите углубиться в тему kafka-engine в ClickHouse, то можно воспользоваться официальной документацией.

ARRAY

Массивы — очень мощный инструмент ClickHouse. Для написания эффективных запросов их стоит знать и понимать, так как они могут ускорить выполнение вашего SQL-кода в разы.

Хорошая документация по массивам представлена на сайте ClickHouse по ссылке.

Также вы можете ознакомиться с видео Работа с массивами в ClickHouse | Мария Сомова | karpov.courses. В нём приведены частые примеры аналитических задач, с которыми можно справиться при помощи массивов.

Python client

С ClickHouse можно взаимодействовать через множество разнообразных клиентов: Python, Rust, Java, etc.

Но я бы хотел показать пару примеров того, как при помощи Python можно работать с ClickHouse.

Вся документация по Python Client доступна по ссылке.

В начале необходимо установить пакет для работы с ClickHouse, для этого выполните команду:

pip install clickhouse-connect

После успешной установки давайте создадим таблицу следующим кодом:

import clickhouse_connect

client = clickhouse_connect.get_client(
    host='localhost',
    username='click',
    password='click',
)

client.query(
    '''
    CREATE TABLE IF NOT EXISTS test_table 
    (
        id UInt8,
        name String
    ) 
    ENGINE = MergeTree()
    ORDER BY id
    '''
)

И давайте загрузим немного данных в нашу таблицу test_table:

import clickhouse_connect

client = clickhouse_connect.get_client(
    host='localhost',
    username='click',
    password='click',
)

client.query(
    '''
    INSERT INTO test_table
    VALUES
    (1, 'name1'),
    (2, 'name2'),
    (3, 'name3'),
    (4, 'name4'),
    (5, 'name5'),
    (6, 'name6'),
    (7, 'name7'),
    (8, 'name8'),
    (9, 'name9'),
    (10, 'name10')
    '''
)

И теперь можно это получить из ClickHouse в удобном для нас формате. Код ниже получит данные в виде pd.DataFrame:

import clickhouse_connect

client = clickhouse_connect.get_client(
    host='localhost',
    username='click',
    password='click',
)

df = client.query_df(
    '''
    SELECT * FROM test_table
    ''',
)

Важно: для корректной работы метода query_df необходимо установить библиотеку pandas командой: pip install pandas

Также мы можем получить данные в виде кортежей:

import clickhouse_connect

client = clickhouse_connect.get_client(
    host='localhost',
    username='click',
    password='click',
)

with client.query_rows_stream('SELECT * FROM test_table') as stream:
    for row in stream:
        print(row)

chDB

На самом деле про chDB можно написать отдельную статью, но на текущий момент я обойдусь ссылками на материалы от ClickHouse.

Вся информация про chDB находится на сайте ClickHouse, с ней вы можете ознакомиться по ссылке.

Я бы сказал, что chDB является альтернативой, а иногда дополнением к DuckDB, потому что она себя также позиционирует:

  • In-process OLAP Engine

  • Без сервера

  • Легко устанавливается

  • Имеет разные API

  • И прочие моменты, которые описаны по ссылке.

Если вы хотите больше узнать про DuckDB, то у меня есть статья на эту тему Всё что нужно знать про DuckDB.

INSERT DATA (Вставка данных)

Важной особенностью ClickHouse является то, что вставка данных должна происходить батчами и чем больше батч по размеру — тем лучше. Это обусловлено спецификой БД.

Если вы будете совершать батчевые вставки, исключите построчную вставку, то ваш ClickHouse будет только рад.

Более подробно почему необходимо совершать вставку батчами описано в документации.

Широкие таблицы

Также стоит отметить, что в ClickHouse не такие эффективные JOIN, как в других OLAP СУБД или в тех же OLTP.

Поэтому вам необходимо избегать лишних JOIN при написании аналитических запросов.

В ClickHouse используется подход Denormalizing Data, в ClickHouse не реализуем Data Vault 1, Data Vault 2 или Anchor Modeling. В ClickHouse ваша задача — делать широкие таблицы для аналитики, которые будут покрывать множество аналитических запросов.

Больше информации про Denormalizing Data описано в документации.

И после ознакомления о Denormalizing Data стоит изучить Using JOINs in ClickHouse

Резюме

ClickHouse — очень мощный инструмент, не хватит и одной статьи, чтобы осветить все его возможности, плюсы и минусы. В данной статье я хотел вас познакомить с ним. Немного рассказать о инструменте, который часто встречается на Data-проектах.

Не бойтесь его. ClickHouse является также и очень популярным инструментом, поэтому найти информацию по вашему вопросу не составит труда.

Стоит ещё отметить, что ClickHouse был разработан в России и поэтому у него есть большое ru-комьюнити. К нему можно присоединиться в TG.

Ну и самое главное — Теория без практики мертва, практика без теории слепа. Поэтому попробуйте ClickHouse, даже на pet-проектах или в рамках данной статьи.

Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.

© Habrahabr.ru