**Компания:** Яндекс
**Контекст:** Нужно построить 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
Это задание для уровня hard. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.
Подобные задания в категории «data_engineering» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: real-time, Kafka, ClickHouse, Grafana, streaming.
На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть другие задания в категории «data_engineering», продуктовые кейсы, справочник метрик, AI мок-собеседование с разбором ваших ответов.
← Все задания