Что такое Apache Druid и для каких задач он используется?

«Что такое Apache Druid и для каких задач он используется?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Apache Druid — это распределенная, колоночная, высокопроизводительная система для аналитики в реальном времени (OLAP), оптимизированная для работы с временными рядами и событийными данными.

Ключевые особенности и задачи:

  • Низкая задержка запросов: Предназначен для sub-second запросов к большим объемам данных.
  • Высокая пропускная способность приема: Поддерживает потоковый (streaming) и пакетный (batch) ingestion данных.
  • Аналитика временных рядов: Идеален для дашбордов, мониторинга, анализа поведения пользователей.
  • Колоночное хранение: Эффективное сжатие и быстрый доступ только к нужным столбцам.
  • Распределенная архитектура: Компоненты (Coordinator, Overlord, Broker, Historical, MiddleManager) разделены для масштабирования и отказоустойчивости.

Архитектура запроса:

  1. Клиент отправляет запрос на Broker.
  2. Broker определяет, какие Historical и MiddleManager узлы хранят релевантные сегменты данных.
  3. Запрос распараллеливается, выполняется на этих узлах, и результаты агрегируются Broker-ом.
  4. Coordinator управляет распределением сегментов по узлам.
  5. Overlord контролирует процесс загрузки (ingestion) данных.

Пример запроса (SQL):

-- Агрегация событий по часам и измерению
SELECT
  TIME_FLOOR(__time, 'PT1H') AS "hour",
  country,
  COUNT(*) AS "events",
  SUM(revenue) AS "total_revenue"
FROM "web_events"
WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '1' DAY
GROUP BY 1, 2
ORDER BY "hour" DESC, "total_revenue" DESC
Сравнение с другими системами: Система Тип Сильные стороны Druid
ClickHouse OLAP-СУБД Лучшая встроенная поддержка потокового ingestion, управление данными на уровне сегментов.
Elasticsearch Поисковый движок Гораздо быстрее для сложных группировок и агрегаций по временным рядам.
Hive/Spark Пакетная обработка Запросы в реальном времени, а не пакетные.

Типичный стек использования: Kafka/Stream (источник данных) → Apache Kafka (поток) / Apache Spark (пакет) → Druid (хранение и анализ) → Grafana/Superset (визуализация).