ClickHouse оптимизирован для высокоскоростной загрузки данных, особенно для аналитики в реальном времени. Выбор правильной стратегии загрузки зависит от требований к задержке, источников данных и размера нагрузки.
1. Выбор правильной стратегии загрузки
Стратегия | Лучше всего подходит для | Задержка | Масштабируемость |
---|---|---|---|
Пакетные вставки (INSERT INTO) | Низкий объем данных, периодическая загрузка данных | Средняя | Высокая |
Kafka Engine (Потоковые данные) | Вставка событий в реальном времени | Низкая | Очень высокая |
RabbitMQ Engine | Потоковые события на основе сообщений | Низкая | Средняя |
S3 Engine | Загрузка больших наборов данных из S3 | Высокая | Очень высокая |
HTTP API (INSERT FORMAT JSONEachRow) | IoT и веб-приложения | Низкая | Средняя |
Native TCP Protocol (clickhouse-client) | Высокоскоростная структурированная загрузка данных | Низкая | Высокая |
2. Стратегия 1: Пакетные вставки (лучше всего подходит для периодической загрузки данных)
📌 Кейс: Загрузка данных пакетами каждую секунду/минуту.
✅ Оптимизировано для колонночного хранения, но маленькие вставки могут создавать слишком много частей.
Как использовать пакетные вставки
INSERT INTO events (event_id, event_time, user_id)
VALUES (1, now(), 1001), (2, now(), 1002);
🔹 Советы по оптимизации:
- Используйте пакетные вставки вместо частых маленьких вставок для уменьшения фрагментации:
INSERT INTO events FORMAT TSV
1 2024-02-08 10:00:00 1001
2 2024-02-08 10:01:00 1002
3 2024-02-08 10:02:00 1003
- Увеличьте
min_insert_block_size_rows
для уменьшения мелких частей:
SET min_insert_block_size_rows = 100000;
- Если существует слишком много маленьких вставок, выполните слияние частей вручную:
OPTIMIZE TABLE events FINAL;
🚀 Преимущества:
✔️ Легко внедряется
✔️ Высокая скорость загрузки (миллионы строк в секунду)
✔️ Лучше всего подходит для структурированной, периодической загрузки данных
⚠️ Недостатки: ❌ Не подходит для потоковой загрузки в реальном времени
❌ Слишком много маленьких вставок может замедлить производительность
3. Стратегия 2: Kafka Engine (лучше всего подходит для потоковых данных в реальном времени)
📌 Кейс: Потоковая загрузка данных в реальном времени из Kafka.
✅ Очень масштабируемая, событийно-управляемая загрузка данных.
Как использовать Kafka для потоковой загрузки данных
1️⃣ Создайте таблицу с использованием Kafka Engine:
CREATE TABLE kafka_logs (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka-broker:9092',
kafka_topic_list = 'clickhouse-events',
kafka_format = 'JSONEachRow',
kafka_group_name = 'clickhouse_group';
2️⃣ Создайте таблицу MergeTree для хранения данных из Kafka:
CREATE TABLE events_local (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = MergeTree()
ORDER BY event_time;
3️⃣ Автоматически переместите данные из Kafka в ClickHouse:
CREATE MATERIALIZED VIEW kafka_to_events
TO events_local AS
SELECT * FROM kafka_logs;
🚀 Преимущества: ✔️ Реальная загрузка данных в реальном времени
✔️ Нулевая задержка (поскольку данные непрерывно записываются)
✔️ Масштабируется до миллионов событий в секунду
⚠️ Недостатки: ❌ Требуется настройка Kafka
❌ Может быть сложным для маломасштабных приложений
4. Стратегия 3: RabbitMQ Engine (лучше всего подходит для событийных приложений)
📌 Кейс: Потоковая загрузка данных на основе сообщений, логирование в реальном времени.
✅ Идеально подходит, когда Kafka недоступна или используются очереди сообщений.
Как использовать RabbitMQ для потоковой загрузки данных
1️⃣ Создайте таблицу с использованием RabbitMQ Engine:
CREATE TABLE rabbitmq_logs (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = RabbitMQ
SETTINGS rabbitmq_host_port = 'rabbitmq:5672',
rabbitmq_exchange_name = 'clickhouse-exchange',
rabbitmq_format = 'JSONEachRow',
rabbitmq_queue_base = 'clickhouse-queue';
2️⃣ Создайте таблицу MergeTree для хранения данных:
CREATE TABLE events_local (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = MergeTree()
ORDER BY event_time;
3️⃣ Автоматически сохраните данные из RabbitMQ:
CREATE MATERIALIZED VIEW rabbitmq_to_events
TO events_local AS
SELECT * FROM rabbitmq_logs;
🚀 Преимущества:
✔️ Лучше всего подходит для событийных приложений
✔️ Работает с существующими очередями сообщений
✔️ Низкая задержка
⚠️ Недостатки: ❌ Медленнее, чем Kafka для приложений с очень высокой пропускной способностью
❌ Требуется настройка RabbitMQ
5. Стратегия 4: HTTP API (лучше всего подходит для IoT и веб-приложений)
📌 Кейс: IoT, мобильные или веб-приложения, которые отправляют данные в формате JSON в реальном времени.
✅ Быстрая и простая загрузка через API.
Как вставить данные через HTTP API
curl -X POST 'http://clickhouse:8123/?query=INSERT INTO events FORMAT JSONEachRow' \
--data-binary @- << EOF
{"event_id":1, "event_time":"2024-02-08 10:00:00", "user_id":1001}
{"event_id":2, "event_time":"2024-02-08 10:01:00", "user_id":1002}
EOF
🚀 Преимущества:
✔️ Легко внедряется (без дополнительных зависимостей)
✔️ Хорошо работает для низкой и средней пропускной способности
✔️ Подходит для серверных приложений
⚠️ Недостатки: ❌ Не оптимизировано для очень высокой пропускной способности
❌ HTTP накладные расходы могут замедлить большую загрузку
6. Стратегия 5: Использование S3 Engine для загрузки больших данных
📌 Кейс: Загрузка данных в реальном времени или пакетных данных из AWS S3.
✅ Хорошо работает для масштабной аналитики и холодного хранения.
Как использовать S3 Engine для загрузки данных
1️⃣ Создайте таблицу для чтения данных из S3:
CREATE TABLE s3_events (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = S3('https://my-bucket.s3.amazonaws.com/events.csv', 'CSV');
2️⃣ Запросите данные непосредственно из S3:
SELECT * FROM s3_events WHERE event_time >= now() - INTERVAL 1 HOUR;
🚀 Преимущества:
✔️ Бесконечная масштабируемость
✔️ Снижает затраты на хранение
⚠️ Недостатки:
❌ Высокая задержка запросов по сравнению с прямой загрузкой
❌ Зависимость от доступности S3
🚀 Итоговое заключение
Стратегия загрузки | Лучше всего подходит для |
---|---|
Пакетные вставки | Периодическая загрузка структурированных данных |
Kafka Engine | Потоковая загрузка данных с высокой пропускной способностью |
RabbitMQ Engine | Событийная потоковая загрузка в реальном времени |
HTTP API | IoT и мобильные/веб-приложения |
S3 Engine | Масштабная загрузка данных в хранилище |