Skip to content

Real-Time Analytics: ClickHouse & Apache Kafka

CoreConceptAugust 3, 20269 min read

Modern digital applications generate massive streams of user event logs, IoT sensor metrics, and financial clickstreams. Processing billions of event records per day while serving sub-second SQL analytical dashboards is a major engineering challenge. Traditional OLTP databases (like PostgreSQL) choke under high-throughput concurrent analytical queries, while batch data warehouses (like Snowflake or BigQuery) introduce minutes to hours of ingestion latency.

ClickHouse is an open-source, columnar OLAP database capable of processing hundreds of millions of rows per second per server core. When paired with Apache Kafka, ClickHouse consumes streaming event logs directly, continuously transforming and storing raw events into optimized columnar tables. This guide details ClickHouse Kafka Engine integration, Materialized View transformations, and ReplacingMergeTree engines.

ClickHouse and Apache Kafka streaming analytics architecture with Materialized Views
ClickHouse and Apache Kafka streaming analytics architecture with Materialized Views

Mental Model: Columnar OLAP Storage vs Row-Oriented OLTP

Traditional OLTP databases store data sequentially in rows on disk ([ID, User, Age, Timestamp, IP]). Calculating an aggregate metric (e.g., SELECT AVG(Age) FROM Users) forces the storage engine to read every un-needed column off disk, causing heavy I/O bottlenecks.

ClickHouse Columnar Storage organizes data on disk by column (Age: [21, 35, 42, ...]). Reading AVG(Age) scans only the binary file containing age integers, completely bypassing all other columns.

Combined with Vectorized Query Execution (processing SIMD CPU register CPU instructions in 64,000-row chunks) and aggressive LZ4 data compression (10x ratio), ClickHouse executes analytical queries over billions of event rows in milliseconds. For OLAP comparisons, review clickhouse vs postgresql analytics olap and building event driven microservices kafka schema registry.

Real-time streaming ingestion pipeline from Kafka topic to ClickHouse MergeTree table
Real-time streaming ingestion pipeline from Kafka topic to ClickHouse MergeTree table

Quick reference

  • Columnar storage reads only requested query columns off disk, reducing I/O by 90%+.
  • SIMD vectorized execution processes thousands of data values in single CPU clock cycles.
  • LZ4 and ZSTD compression algorithms achieve 5x to 10x storage byte reduction.
  • Designed specifically for append-heavy analytical workloads with sub-second SLA requirements.
  • Supports real-time SQL aggregation over multi-terabyte dataset tables.

Remember this

Utilize ClickHouse columnar storage and vectorized CPU processing to run sub-second SQL queries over billions of rows.

Kafka Engine Tables: Streaming Ingestion into ClickHouse

Instead of writing custom microservice consumer workers that parse Kafka topics and execute HTTP INSERT calls, ClickHouse provides a native Kafka Engine Table.

Define a ClickHouse table using ENGINE = Kafka:

1CREATE TABLE kafka_user_events_queue (2  user_id UInt64,3  event_type String,4  timestamp DateTime,5  payload String6) ENGINE = Kafka7SETTINGS8  kafka_broker_list = 'kafka:9092',9  kafka_topic_list = 'user-events',10  kafka_group_name = 'ch-consumer-group',11  kafka_format = 'JSONEachRow';

The Kafka Engine acts as a background consumer stream buffer. It automatically polls Kafka topics, parses JSON/Avro bytes, and buffers incoming messages into micro-batches.

Quick reference

  • ClickHouse Kafka Engine table acts as a native streaming consumer background process.
  • Supports JSONEachRow, Avro, Protobuf, and CSV payload deserialization formats.
  • Configures consumer groups automatically to scale ingestion across parallel partitions.
  • Kafka Engine table does not store data permanently — it acts as a stream buffer pipe.
  • Eliminates external ETL pipeline workers, reducing streaming infrastructure complexity.

Remember this

Configure native ClickHouse Kafka Engine tables to stream and deserialize topic messages directly.

Materialized Views & Replacing MergeTree Engine Transformations

Because Kafka Engine tables act as transient buffers, streaming data must be moved into permanent MergeTree storage tables.

Create a Materialized View that listens to the Kafka Engine table and automatically writes transformed records into a target ReplacingMergeTree table:

1CREATE MATERIALIZED VIEW mv_user_events TO target_user_events AS2SELECT user_id, event_type, timestamp3FROM kafka_user_events_queue;

Whenever new messages arrive in Kafka, the Materialized View triggers automatically, executing SQL transformations and appending rows into the permanent MergeTree table without blocking incoming stream ingestion.

Real-time streaming ingestion pipeline from Kafka topic to ClickHouse MergeTree table
Real-time streaming ingestion pipeline from Kafka topic to ClickHouse MergeTree table

Quick reference

  • Materialized Views execute trigger transformations on every incoming Kafka message micro-batch.
  • MergeTree engine family provides primary-key sorting and background data part merging.
  • ReplacingMergeTree automatically deduplicates redundant event updates using version columns.
  • SummingMergeTree pre-aggregates numeric metrics during background compaction merges.
  • Ensures zero data loss during high-throughput ingestion bursts up to 500,000 events/sec.

Remember this

Attach Materialized Views to Kafka Engine tables to stream data into permanent MergeTree tables automatically.

Sub-Second SQL Aggregations over Billions of Event Rows

With streaming data populated into MergeTree tables, engineers execute real-time analytical SQL queries directly:

1SELECT2  toStartOfHour(timestamp) AS hour_bucket,3  event_type,4  count() AS total_events,5  uniqExact(user_id) AS unique_users6FROM target_user_events7WHERE timestamp >= now() - INTERVAL 24 HOUR8GROUP BY hour_bucket, event_type9ORDER BY hour_bucket DESC;

ClickHouse computes exact unique user counts (uniqExact) or hyper-log-log approximations (uniq) over billions of records in sub-50ms, powering real-time executive analytics dashboards.

Quick reference

  • Time-series functions (toStartOfHour, toStartOfDay) simplify temporal bucket grouping.
  • HyperLogLog algorithms (uniq) compute approximate unique cardinalities in microsecond time.
  • Primary key sorting index (ORDER BY (event_type, timestamp)) optimizes range scan pruning.
  • Supports dictionary lookups for instantaneous string key dimension enrichment.
  • Integrates natively with Grafana, Superset, and Metabase for live real-time dashboarding.

Remember this

Execute sub-50ms analytical SQL aggregations over billions of event rows to power real-time dashboards.

Key takeaway

To test ClickHouse with Kafka, run docker-compose with ClickHouse and Kafka services. Create a Kafka Engine table and verify Materialized Views populate streaming records into MergeTree tables.

Share:

Related Articles

Relational databases like PostgreSQL excel at Online Transaction Processing (OLTP)—handling frequent single-row reads, u

Read

Decoupling microservices using Event-Driven Architecture (EDA) requires choosing an asynchronous messaging backbone. Eng

Read

When relational MySQL databases reach multi-terabyte scale, single-instance hardware limits are breached. Vertical scali

Read

Explore this topic

Keep learning

Follow a structured path or browse all courses to go deeper.