Real-time dashboard: Kafka — ClickHouse — Grafana

hard data_engineering Общие

Условие задания

**Компания:** Яндекс

**Контекст:** Нужно построить real-time дашборд для мониторинга бизнес-метрик: RPS (requests per second), ошибки, latency, активные пользователи — с обновлением каждые 10 секунд.

**Задание:**
1. Спроектируйте архитектуру: от генерации события до отображения на дашборде
2. Напишите DDL для ClickHouse: таблицы с движком MergeTree и Materialized Views
3. Составьте SQL-запросы для Grafana-панелей
4. Определите требования к инфраструктуре и оцените стоимость

Пример данных

Структура для ориентира — реальные значения из эталонного решения.

-- Kafka Engine: чтение из Kafka
CREATE TABLE events_kafka (
    event_id UInt64,
    user_id UInt64,
    event_type String,
    endpoint String,
    status_code UInt16,
    latency_ms UInt32,
    event_ts DateTime64(3)
) ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka:9092',
         kafka_topic_list = 'events',
         kafka_group_name = 'clickhouse_consumer',
         kafka_format = 'JSONEachRow';

-- Основная таблица хранения
CREATE TABLE events (
    event_id UInt64,
    user_id UInt64,
    event_type String,
    endpoint String,
    status_code UInt16,
    latency_ms UInt32,
    event_ts DateTime64(3),
    event_date Date DEFAULT toDate(event_ts)
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_type, event_ts, event_id)
TTL event_date + INTERVAL 90 DAY;

-- Materialized View: Kafka → основная таблица
CREATE MATERIALIZED VIEW events_mv TO events AS
SELECT * FROM events_kafka;

-- Предагрегация: метрики по минутам
CREATE TABLE events_1m (
    minute DateTime,
    event_type String,
    endpoint String,
    requests SimpleAggregateFunction(sum, UInt64),
    errors SimpleAggregateFunction(sum, UInt64),
    unique_users AggregateFunction(uniq, UInt64),
    p50_latency AggregateFunction(quantile(0.5), UInt32),
    p95_latency AggregateFunction(quantile(0.95), UInt32),
    p99_latency AggregateFunction(quantile(0.99), UInt32)
) ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(minute)
ORDER BY (minute, event_type, endpoint);

CREATE MATERIALIZED VIEW events_1m_mv TO events_1m AS
SELECT
    toStartOfMinute(event_ts) AS minute,
    event_type,
    endpoint,
    countState() AS requests,
    countIfState(status_code >= 500) AS errors,
    uniqState(user_id) AS unique_users,
    quantileState(0.5)(latency_ms) AS p50_latency,
    quantileState(0.95)(latency_ms) AS p95_latency,
    quantileState(0.99)(latency_ms) AS p99_latency
FROM events_kafka
GROUP BY minute, event_type, endpoint;

Темы

real-time Kafka ClickHouse Grafana streaming

Подсказки

Все тестовые задания →

Частые вопросы

Какой уровень знаний нужен для задачи "Real-time dashboard: Kafka — ClickHouse — Grafana"?

Это задание для уровня hard. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.

На каких собеседованиях встречается такая задача?

Подобные задания в категории «data_engineering» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: real-time, Kafka, ClickHouse, Grafana, streaming.

Сколько времени даётся на решение?

На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.

Где ещё потренироваться по теме «data_engineering»?

На zasqlpython.ru есть другие задания в категории «data_engineering», продуктовые кейсы, справочник метрик, AI мок-собеседование с разбором ваших ответов.

← Все задания