Как на прошлом проекте хранились данные?

«Как на прошлом проекте хранились данные?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На моем последнем проекте по построению DWH мы реализовали многоуровневую архитектуру хранения данных, основанную на их температуре и частоте использования.

Основные слои:

  1. Горячие данные (Hot Data):

    • Для чего: Для оперативной аналитики и дашбордов, требующих ответа за миллисекунды.
    • Технология: ClickHouse в качестве колоночного OLAP-хранилища.
    • Почему: Его сжатие колоночных данных и векторная обработка запросов давали нам скорость агрегации в 100-1000 раз выше, чем у классического PostgreSQL на аналогичных объемах.
    • Пример данных: Последние 30 дней событий пользователей, ежедневные бизнес-метрики.
  2. Теплые данные (Warm Data):

    • Для чего: Для глубокого исторического анализа, ad-hoc запросов и обучения ML-моделей, где скорость не критична, но важна стоимость.
    • Технология: Amazon S3 в формате Apache Parquet, доступ через Trino (Presto SQL) и AWS Athena.
    • Почему: Хранение в S3 на порядки дешевле, а Parquet обеспечивает эффективное сжатие и возможность вычитывать только нужные колонки.
    • Структура в S3:
      s3://analytics-bucket/
      ├── raw/           # Сырые JSON/CSV логи из Kafka
      ├── processed/     # Очищенные, типизированные данные в Parquet
      │   └── dt=2024-01-01/
      │       └── event_type=page_view/
      └── aggregated/    # Предрассчитанные агрегаты для BI-инструментов

      Мы использовали партиционирование по дате (dt) и часто по типу события (event_type) для ускорения запросов.

  3. Метаданные и справочники (Metadata):

    • Для чего: Хранение конфигураций, справочников пользователей, продуктов и т.д.
    • Технология: PostgreSQL с настройкой репликации для отказоустойчивости.
    • Почему: Требовались гарантии ACID, частые точечные обновления и сложные JOIN.

Ключевые оптимизации:

  • CDC (Change Data Capture): Для синхронизации данных из операционных БД (Postgres, MySQL) использовали Debezium, который писал изменения в Apache Kafka, откуда их уже потребляли наши ETL-процессы.
  • Управление данными в S3: На поздних этапах внедрили Apache Iceberg как табличный формат поверх Parquet в S3. Это дало нам ACID-транзакции, управление схемой и time travel-запросы (возможность запросить данные на определенный момент времени).