Что такое ETL и ELT
🎯 Чему вы научитесь
После этого урока вы сможете:
- Объяснить разницу между ETL и ELT на пальцах и на архитектурной схеме
- Выбрать правильный подход для своего источника данных
- Понимать, как слои данных (Raw → Core → Marts) связаны с ETL/ELT
- Ориентироваться в современном Data Stack и месте каждого инструмента
📖 Введение
Почему мы говорим об ETL и ELT?
Представьте, что вы — инженер данных в компании, которая строит ETL-платформу. У вас есть 50+ источников: PostgreSQL-базы, REST API партнёров, S3-бакеты с логами, Kafka-топики с событиями. Каждый источник имеет свою структуру, частоту обновления и требования к безопасности.
Ваша задача — доставить данные в DWH так, чтобы:
- Они были чистыми (без дублей, с корректными типами)
- Не потерялась историчность (как менялись данные во времени)
- Процесс был надёжным (если упал — перезапустился и не наломал дров)
- Запросы аналитиков летали, а не ползали
Первый вопрос, который вы должны решить для каждого источника: "Когда трансформировать данные — до загрузки или после?" Это и есть выбор между ETL и ELT.
ETL: Классический подход
[Источник] → (Extract) → [Staging] → (Transform) → [Core DWH] → (Load) → [Marts]
Процесс:
- Extract — Выгружаем сырые данные из источника в промежуточное хранилище (Staging)
- Transform — Чистим, обогащаем, нормализуем, применяем бизнес-правила вне DWH (например, на Spark-кластере или Python-скриптами)
- Load — Загружаем готовые, трансформированные данные в DWH
Когда выбирать ETL:
| Ситуация | Почему ETL |
|---|---|
| 🔒 Чувствительные данные | Маскировка, шифрование или обезличивание до попадания в DWH (GDPR/HIPAA) |
| ⚡ Слабый DWH | Если ваш DWH не справляется с тяжёлыми трансформациями (например, MySQL как DWH) |
| 🧩 Сложные трансформации | Используете Python-библиотеки (NLP, ML-модели), которые сложно реализовать в SQL |
| 📦 Неструктурированные данные | Обработка JSON/XML/PDF до загрузки в реляционную модель |
Минусы ETL:
- ❌ Узкое место — трансформация (если обработка не успевает, падает весь пайплайн)
- ❌ Сложнее поддерживать историчность (нужно отдельно хранить raw-данные)
- ❌ Высокий порог входа (нужно знать Python/Spark)
ELT: Современный подход
[Источник] → (Extract) → [Raw DWH] → (Load) → (Transform внутри DWH) → [Core/Marts]
Процесс:
- Extract — Выгружаем сырые данные
- Load — Сразу загружаем их в DWH в специальный слой Raw (без изменений!)
- Transform — Трансформируем внутри DWH с помощью SQL/dbt (постепенно превращая Raw → Core → Marts)
Когда выбирать ELT:
| Ситуация | Почему ELT |
|---|---|
| 🚀 Мощный DWH | Snowflake/BigQuery/ClickHouse считают терабайты за секунды |
| 💰 Большие объёмы | Нет смысла тащить 1 ТБ через Python-скрипт, если DWH сделает это быстрее |
| 🔄 Частые изменения требований | Аналитики сами пересобирают витрины через dbt, не беспокоя инженеров |
| 📊 Исследовательский анализ | Сырые данные уже в DWH, можно исследовать их без ожидания трансформации |
Минусы ELT:
- ❌ Сырые данные хранятся в DWH (занимают место, могут содержать PII)
- ❌ Сложнее контролировать качество на входе (грязные данные уже внутри)
- ❌ Запросы к сырому слою могут быть неоптимальными
Таблица сравнения ETL vs ELT
| Критерий | ETL | ELT |
|---|---|---|
| Где трансформация | Вне DWH | Внутри DWH |
| Когда трансформация | До загрузки | После загрузки |
| Сырые данные в DWH | ❌ Нет | ✅ Да (Raw-слой) |
| Скорость загрузки | Медленнее (из-за трансформации) | Быстрее (загружаем как есть) |
| Гибкость | Низкая (нужно переделывать пайплайн) | Высокая (меняем SQL-запросы) |
| Инструменты | Python, Spark, Pandas | SQL, dbt, агрегации в DWH |
| Подходит для | Маскировка PII, ML-пайплайны | Большие данные, Agile-аналитика |
Слои данных: Практическая архитектура
Независимо от выбора ETL или ELT, в современном DWH принято выделять слои:
┌─────────────────────────────────────────────────────────────┐
│ Sources (OLTP, API, Logs, Kafka) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Bronze (Raw Data) │
│ Храним данные в виде: JSON-логи, CDC-события │
│ Историчность: полная, никогда не меняем │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Silver (Cleaned & Enriched) │
│ Дедупликация, SCD Type 2, нормализация, DQ-проверки │
│ Историчность: SCD2, только валидные данные │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Gold (Aggregated / Marts) │
│ Витрины для аналитики: отчёты, дашборды, KPI │
│ Историчность: агрегированная (месяц/квартал) │
└─────────────────────────────────────────────────────────────┘
В ETL: Мы делаем Transform из Bronze в Silver ещё до загрузки, затем загружаем готовый Silver.
В ELT: Сначала загружаем Bronze, потом внутри DWH строим Silver и Gold (через dbt или представления).
Инструменты в Data Stack
Зная ETL и ELT, вы уже можете классифицировать инструменты:
| Категория | ETL-инструменты | ELT-инструменты | Что делают |
|---|---|---|---|
| Extract | Airbyte, Fivetran, Stitch | Airbyte, Fivetran, Stitch | Забирают данные из источников |
| Transform | Python, Spark, Pandas | dbt, SQL, Spark SQL | Трансформируют данные |
| Orchestration | Airflow, Prefect, Dagster | Airflow, Prefect, Dagster | Запускают пайплайны по расписанию |
| Storage | S3/Staging как буфер | DWH (Snowflake/BQ/CH) | Хранят данные |
| Streaming | Kafka + Flink/Spark | Kafka + Flink/Spark | Обрабатывают потоковые данные |
Важно: Современные пайплайны часто используют гибридный подход:
- Для чувствительных данных — ETL (маскировка до загрузки)
- Для основных потоков — ELT (загружаем сырые, трансформируем внутри)
🔥 Инженерный лайфхак: Выбор подхода для вашего источника
Задайте себе 3 вопроса для каждого источника:
| Вопрос | Если ДА | Если НЕТ |
|---|---|---|
| 1. Есть ли в данных PII (персональные данные)? | Используйте ETL для маскировки до загрузки | Можно использовать ELT |
| 2. Объём данных > 100 ГБ за загрузку? | Используйте ELT (DWH справится быстрее) | Используйте ETL (дешевле) |
| 3. Трансформации сложные (ML/NLP)? | Используйте ETL (Python-библиотеки) | Используйте ELT (SQL достаточно) |
Резюме: Главные мысли
- ETL — трансформируем до загрузки. Хорошо для защиты данных и сложной логики. Узкое место — мощность трансформации.
- ELT — трансформируем после загрузки. Хорошо для больших данных и гибкости. Узкое место — мощность DWH.
- Слои Bronze → Silver → Gold — универсальная архитектура, работает и для ETL, и для ELT.
- Современный подход — гибрид: PII-данные через ETL, основные потоки через ELT.
📝 Практическое задание (Домашняя работа)
Это задание вы выполните в следующем уроке, но уже сейчас подумайте:
Задача: У вас есть 4 источника данных. Для каждого определите, какой подход (ETL или ELT) вы выберете и почему.
| Источник | Объём/день | Особенности |
|---|---|---|
| Таблица клиентов (PostgreSQL) | 10 000 записей | Есть паспортные данные, обновляется редко |
| Логи мобильного приложения (S3) | 5 ГБ (JSON) | Миллионы событий, нужны агрегаты |
| API курсов валют | 100 записей | Обновляется каждый час |
| История заказов (Kafka) | 500 ГБ | Потоковые данные, нужна аналитика за 3 года |
✅ Контрольные вопросы (для самопроверки)
- В чём ключевая разница между ETL и ELT?
- Когда вы выберете ETL вместо ELT?
- Что такое Bronze/Silver/Gold слои? Зачем они нужны?
- Какой подход использует dbt? Почему?
- Почему в современных платформах часто используют гибрид ETL+ELT?
🔗 В следующем уроке
Мы перейдём к Обзору источников данных и на практике увидим, как эти архитектурные решения применяются к реальным источникам: RDBMS, API, File Storage и Kafka. Вы научитесь классифицировать источники и выбирать стратегию загрузки для каждого.
Прочитайте урок до конца — прогресс засчитается автоматически