Что такое ClickHouse: Полный гид по колоночной СУБД для сверхбыстрой аналитики. Урок 1.

бесплатный курс по основам ClickHouse - Типы данных и движки таблиц

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

Миссия: обрабатывать огромные объемы данных с максимальной скоростью

История ClickHouse началась в 2009 году в стенах компании Яндекс, где он был создан для обслуживания системы веб-аналитики Яндекс.Метрика. Представьте себе задачу: обрабатывать триллионы событий ежедневно. Традиционные реляционные базы данных, такие как PostgreSQL или MySQL, просто не справлялись с такими колоссальными нагрузками. Стало очевидно, что нужен принципиально новый подход.

Именно так и родилась главная миссия ClickHouse ( далее CH): максимально быстро выполнять аналитические запросы (агрегацию, фильтрацию, группировку) на гигантских массивах данных. Важно понимать, что CH — это не замена базам данных для транзакционных операций, вроде банковских переводов или оформления заказов в интернет-магазине. Его стихия — это аналитика. В 2016 году Яндекс сделал ClickHouse проектом с открытым исходным кодом, что стало мощным толчком к его развитию и популярности в мировом IT-сообществе.

В чем секрет скорости? Колоночное хранение против строкового

Чтобы понять, почему CH так быстр, необходимо разобраться в его фундаментальном отличии от большинства привычных баз данных: он является колоночной СУБД (Column-Oriented Database Management System), в то время как PostgreSQL, MySQL, SQL Server и Oracleстроковые (Row-Oriented).

Давайте представим таблицу с данными:

ID Имя Возраст Город
1 Анна 30 Москва
2 Борис 25 Санкт-Петербург
3 Мария 35 Казань

Строковое с колоночным хранением

 

Как хранят данные строковые СУБД (например, PostgreSQL)? Они хранят данные по строкам. То есть, когда вы записываете строку, она сохраняется целиком:

[1, Анна, 30, Москва], [2, Борис, 25, Санкт-Петербург], [3, Мария, 35, Казань]

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

Как хранят данные колоночные СУБД? CH хранит данные по столбцам. Это значит, что он группирует все значения одного столбца вместе:

[1, 2, 3] (столбец ID)

[Анна, Борис, Мария] (столбец Имя)

[30, 25, 35] (столбец Возраст)

[Москва, Санкт-Петербург, Казань] (столбец Город)

 

В чем преимущество колоночного хранения ClickHouse для аналитики?

Представьте, что вам нужно посчитать средний возраст пользователей: SELECT AVG(Возраст) FROM Таблица;

  • В строковой СУБД: Базе данных придется прочитать все строки, чтобы добраться до значения “Возраст” в каждой из них. Это означает чтение большого объема ненужных данных (Имя, Город).

Row oriented ClickHouse Format

  • В колоночной СУБД: ClickHouse просто считывает столбец “Возраст” целиком. Ему не нужно читать столбцы “Имя” и “Город”. Это dramatically сокращает объем данных, которые нужно считать с диска, и значительно ускоряет выполнение запроса.Column Oriented ClickHouse

 

Дополнительные преимущества колоночной СУБД:

Высокая степень сжатия данных: Данные в одном столбце имеют один и тот же тип и часто схожие значения, что позволяет применять более эффективные алгоритмы сжатия. Например, столбец с boolean-значениями (true/false) или с ограниченным набором категорий (например, “мужской/женский”) будет сжат намного лучше, чем случайный набор данных разных типов в строке. Это экономит место на диске и еще больше ускоряет чтение.

Эффективное использование CPU: ClickHouse спроектирован так, чтобы максимально загружать CPU за счет векторизованных вычислений. Это означает, что он обрабатывает данные пачками (векторами), а не по одному значению, что позволяет лучше использовать возможности современных процессоров.

 

Построение DWH на ClickHouse

Код курса
CLICH
Ближайшая дата курса
22 сентября, 2025
Продолжительность
24 ак.часов
Стоимость обучения
72 000

 

Ключевые преимущества ClickHouse: Почему его выбирают?

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

Феноменальная скорость: Это, пожалуй, главная причина. ClickHouse способен обрабатывать миллиарды строк за секунды. Он не просто быстр – он ультрабыстр. Вы почувствуете это на больших наборах данных.

Масштабируемость: CH легко масштабируется как вертикально (добавляя больше ресурсов одному серверу), так и горизонтально (добавляя новые серверы в кластер). Вы можете начать с одного сервера и по мере роста данных добавлять новые, распределяя нагрузку.

Поддержка SQL: CH использует расширенный диалект SQL, который интуитивно понятен всем, кто уже работал с реляционными базами данных. Это снижает порог входа для разработчиков и аналитиков.

Разнообразие движков таблиц: ClickHouse предлагает множество движков таблиц (Table Engines), каждый из которых оптимизирован для своих задач (например, MergeTree для обычной аналитики, ReplacingMergeTree для обработки дубликатов, Kafka для чтения из Kafka-топиков). Это дает огромную гибкость.

Расширенные аналитические функции: CH предоставляет богатый набор агрегатных функций, оконных функций, функций для работы с массивами и строками, что позволяет выполнять сложные аналитические запросы прямо в базе данных.

Открытый исходный код и активное сообщество: Будучи open-source проектом, CH активно развивается, имеет огромное сообщество пользователей и разработчиков, что обеспечивает быструю поддержку и появление новых функций.

Надежность и отказоустойчивость: Встроенные механизмы репликации и распределения данных обеспечивают высокую доступность и сохранность данных даже в случае сбоев отдельных узлов.

 

Где используется ClickHouse? Примеры из реального мира

Веб-аналитика: Яндекс.Метрика, Cloudflare, Sentry – сбор и анализ данных о посещениях сайтов, поведении пользователей, метриках производительности.

Ad-Tech: Анализ рекламных кампаний, кликов, показов, конверсий в реальном времени.

Мониторинг и логирование: Сбор и анализ логов серверов, приложений, сетевого оборудования для выявления аномалий и проблем.

IoT (Интернет вещей): Обработка потоков данных с датчиков и устройств.

Финансовые данные: Анализ транзакций, торговых операций, рыночных данных.

Телекоммуникации: Анализ CDR (Call Detail Records), трафика.

Если у вас есть большие объемы данных, которые нужно быстро агрегировать, фильтровать и анализировать, то ClickHouseэто ваш выбор.

Начинаем работу: локальная установка через Docker

Docker – это самый простой и быстрый способ запустить ClickHouse на вашей машине, будь то Windows, macOS или Linux. Убедитесь, что у вас установлен Docker Desktop, и выполните в терминале одну команду:

docker run -d --name clickhouse-server --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 clickhouse/clickhouse-server

Давайте разберем эту команду:

-d: Запускает контейнер в фоновом режиме (detached mode).

--name clickhouse-server: Дает вашему контейнеру понятное имя.

--ulimit nofile=262144:262144: Устанавливает лимит на количество открытых файлов для процесса ClickHouse (важно для производительности).

-p 8123:8123: Маппинг портов. Порт 8123 используется для HTTP-интерфейса ClickHouse (например, для подключения через веб-браузер или BI-инструменты).

-p 9000:9000: Порт 9000 используется для TCP-интерфейса (для clickhouse-client, JDBC/ODBC драйверов).

-p 9009:9009: Порт для ClickHouse Keeper (если вы будете использовать его для координации кластера, хотя на этом этапе это не критично).

clickhouse/clickhouse-server: Имя Docker-образа, который мы используем.

 

Docker скачает образ (если его еще нет) и запустит контейнер. Для подключения к вашему новому серверу проще всего запустить еще один контейнер с клиентом:

docker run -it --rm --link clickhouse-server clickhouse/clickhouse-client --host clickhouse-server

-it: Интерактивный режим.

--rm: Удалит контейнер клиента после выхода.

--link clickhouse-server: Связывает клиентский контейнер с контейнером сервера по имени (устаревший, но простой способ для одного хоста). В более новых версиях Docker или в production лучше использовать Docker Compose или сетевые настройки.

clickhouse/clickhouse-client: Образ клиента.

--host clickhouse-server: Указывает клиенту, к какому хосту подключаться (имя вашего контейнера).

Если все прошло успешно, вы увидите приветственное приглашение clickhouse :). Поздравляем, вы в консоли ClickHouse!

Альтернатива: быстрый старт с ClickHouse Cloud

Если вы не хотите заниматься установкой и настройкой, идеальным вариантом будет ClickHouse Cloud или Yandex Cloud Managed Service for Clickhouse. Это полностью управляемый сервис, который позволяет вам создать готовый к работе кластер ClickHouse за несколько минут.

Перейдите на сайт ClickHouse.com: Откройте ваш веб-браузер и перейдите на https://clickhouse.com/.

Зарегистрируйтесь и войдите в аккаунт:

Нажмите кнопку “Get Started” или “Sign Up”. Вы можете зарегистрироваться, используя Google-аккаунт, GitHub или электронную почту. Обычно предоставляется бесплатный пробный период или стартовый лимит ресурсов.

 

Создайте новый сервис (Service):

После входа в панель управления ClickHouse Cloud, вы увидите опцию для создания нового сервиса. Вам будет предложено выбрать регион (например, AWS US East, GCP Europe West) и размер кластера (например, “Developer” или “Production” с разным количеством CPU и RAM). Для начала вполне подойдет минимальный “Developer” или “Starter” план. Присвойте имя вашему сервису.

 

Получите данные для подключения:

После создания сервиса (это может занять несколько минут), перейдите в его детали. Там вы найдете информацию для подключения:

Host (Endpoint): Адрес вашего ClickHouse Cloud инстанса (например, xxx.yyyy.gcp.clickhouse.cloud).

Port: Обычно 8443 (HTTPS) или 9440 (TCP/TLS).

User: Обычно default.

Password: Пароль, который вы можете сгенерировать или установить в настройках пользователя.

Важно: ClickHouse Cloud использует защищенные соединения (TLS/SSL) по умолчанию.

 

Подключитесь к ClickHouse Cloud

Подключиться к облачному сервису можно как через уже знакомый clickhouse-client, так и через множество популярных BI-инструментов, таких как DBeaver, DataGrip, Metabaseили Grafana.

Через Веб-интерфейс (ClickHouse Play): Самый простой способ. В панели управления ClickHouse Cloud обычно есть встроенный веб-интерфейс (или ссылка на него, часто называемый “ClickHouse Play” или “SQL Console”), где вы можете выполнять запросы прямо из браузера. Это отличный инструмент для быстрого тестирования и просмотра данных. Просто введите свои запросы и нажмите “Run”.

Через clickhouse-client (локально): Если вы предпочитаете работать из терминала, можно использовать clickhouse-client с параметрами вашего облачного инстанса. Вам нужно будет указать хост, порт, пользователя и пароль, а также флаг --secure или --tls для защищенного соединения.

--пример команды  (замените YOUR_HOST, YOUR_USER, YOUR_PASSWORD):
clickhouse-client --host YOUR_HOST --port 9440 --user YOUR_USER --password YOUR_PASSWORD --secure

Подлключение через clickhouse client в консоли

Через BI-инструменты (DBeaver, DataGrip, Metabase, Grafana и т.д.): Большинство популярных BI-инструментов имеют нативные коннекторы для CH. Вам просто нужно будет ввести полученные данные для подключения (хост, порт, пользователь, пароль) и убедиться, что включен SSL/TLS.

 

Создаем первую таблицу и работаем с данными

Теперь, когда у нас есть доступ к ClickHouse, давайте создадим нашу первую таблицу.

-- Создаем базу данных
CREATE DATABASE IF NOT EXISTS my_first_db;

-- Переключаемся в нее
USE my_first_db;

-- Создаем таблицу для логов
CREATE TABLE access_logs (
    timestamp   DateTime64(3),
    event_type  LowCardinality(String),
    user_id     UInt64,
    ip_address  IPv4,
    url         String,
    duration_ms UInt32
)
ENGINE = MergeTree()
ORDER BY (timestamp, user_id);

-- весь код доступен для выгрузки в SQL блокноте на GitHub https://github.com/BigDataSchoolRU/clickhouse_intro_course

Разберем команду CREATE TABLE:

timestamp DateTime64(3): Тип данных DateTime64 позволяет хранить дату и время с точностью до миллисекунд (3 знака после запятой). DateTime хранит с точностью до секунды.

event_type LowCardinality(String): String – это обычная строка. LowCardinality – это модификатор типа данных, который очень эффективен для столбцов с небольшим количеством уникальных значений (например, event_type – у вас будет ограниченный набор типов событий). Он значительно экономит память и ускоряет запросы на фильтрацию и группировку по таким столбцам.

user_id UInt64: Беззнаковое 64-битное целое число. Хорошо подходит для ID.

ip_address IPv4: Специальный тип данных для IPv4-адресов, который хранит их как 32-битное целое число, что очень эффективно для хранения и фильтрации.

url String: Обычная строка для URL.

duration_ms UInt32: Беззнаковое 32-битное целое число для продолжительности.

ENGINE = MergeTree(): Мы указываем, что используем движок MergeTree. Это основной движок для таблиц, предназначенных для хранения больших объемов данных с сортировкой по первичному ключу.

ORDER BY (timestamp, user_id): Это ключ сортировки (primary key) для MergeTree. Данные на диске будут отсортированы по timestamp, а затем по user_id. Это очень важно для производительности ClickHouse, так как он использует этот порядок для быстрого поиска и агрегации данных. При выполнении запросов с WHERE условием по timestamp или user_id, ClickHouse сможет быстро отфильтровать нужные блоки данных.

 

Теперь вставим несколько строк и выполним первый аналитический запрос:

-- Вставляем данные
INSERT INTO access_logs VALUES
('2024-06-19 10:00:00.123', 'page_view', 101, '192.168.1.1', '/home', 150),
('2024-06-19 10:00:01.456', 'click', 101, '192.168.1.1', '/button_a', 20),
('2024-06-19 10:00:02.789', 'page_view', 102, '10.0.0.5', '/products', 300);

-- Выполняем аналитический запрос
SELECT
    event_type,
    count(DISTINCT user_id) AS unique_users,
    avg(duration_ms) AS avg_duration_ms
FROM access_logs
GROUP BY event_type;

-- весь код доступен для выгрузки в SQL блокноте на GitHub https://github.com/BigDataSchoolRU/clickhouse_intro_course

Обратите внимание, что INSERT в ClickHouse оптимизирован для массовой вставки данных. Вставка по одной строке (INSERT INTO ... VALUES (...)) неэффективна для больших объемов. В реальных сценариях данные обычно вставляются большими пачками (батчами) или потоками из Kafka, S3 и т.д. Посчитаем количество уникальных пользователей и среднюю продолжительность событий для каждого типа события:

Аналитический запрос в ClickHouse

Что дальше?

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


Использованные референсы и материалы

  1. Официальная документация ClickHouse: https://clickhouse.com/docs/en/
  2. Сообщество ClickHouse на GitHub: https://github.com/ClickHouse/ClickHouse
  3. Интерактивная песочница ClickHouse Play: https://play.clickhouse.com/

SQL-блокнот к Уроку 1 бесплатного курса доступен в нашем репозитории на GitHub