До сих пор данные в ClickHouse появлялись из INSERT, который мы писали руками. В жизни события «Гонца» приходят двумя путями. Живой поток: приложение шлёт события в Kafka, и они должны попасть в ClickHouse за секунды. И файлы: партнёры и ночные выгрузки складывают данные в облачное хранилище S3, а ClickHouse должен их прочитать. Для обоих путей у ClickHouse есть встроенные средства.
Поток из Kafka
Вспомним урок про батчи: писать в ClickHouse по одному событию нельзя, нужны пачки. Kafka как раз решает эту задачу. Приложение пишет события в тему по одному, а читатель забирает их пачками по тысячам штук.
Читателем может быть отдельный сервис, а может быть сам ClickHouse. Для этого есть движок Kafka. Таблица на нём ничего не хранит: она подписана на тему и выдаёт новые сообщения тому, кто её читает. Читает её материализованное представление, и складывает сообщения в обычную таблицу MergeTree. Получается конвейер из трёх таблиц:
-- 1. Подписка на тему
CREATE TABLE events_queue (ts DateTime, user_id UInt32, kind String, platform String)
ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'events',
kafka_group_name = 'clickhouse',
kafka_format = 'JSONEachRow';
-- 2. Хранилище
CREATE TABLE app_events (...) ENGINE = MergeTree ORDER BY (kind, ts);
-- 3. Перекладчик: читает очередь и пишет в хранилище
CREATE MATERIALIZED VIEW app_events_mv TO app_events AS
SELECT ts, user_id, kind, platform FROM events_queue;
ClickHouse сам читает тему пачками, представление на каждую пачку дописывает строки в app_events, а смещение в теме сдвигается после успешной записи. Читать events_queue напрямую SELECT-ом нельзя: сообщение, прочитанное запросом, не досталось бы представлению. ClickHouse так и отвечает, ошибкой NOT_IMPLEMENTED.
В песочнице настоящего брокера нет: вместо него заглушка с темой events из шести сообщений, которые представление забирает сразу после создания.
урок из курса
Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.