ETL vs ELT data pipelines: classic ETL (Informatica -> MS SQL DW), modern ELT (Fivetran -> S3 -> Snowflake -> dbt -> Looker), reverse ETL (warehouse -> Hightouch -> Salesforce), and an ADR scenario showing when ETL still wins for PII redaction pre-load (Spark redactor masks before warehouse to satisfy GDPR).
Если есть аналитика — есть pipeline данных. Order-сервис пишет в Postgres, marketing хочет «sales by country by week», finance — «MRR cohort», ML — «user features». Сырые данные надо transport'ировать, joining, aggregat'ить, моделировать — это и есть ETL/ELT.
Выбор между ETL и ELT — архитектурный, не стилистический. Определяет:
ETL доминировал 1995-2015 — Informatica, Talend, Pentaho, Ab Initio. Огромные ETL-серверы трансформировали данные до Teradata/Oracle DWH, потому что DWH compute был дорогой и дефицитный. ELT захватил 2015-2025 на трёх волнах: дешёвый object storage (S3), elastic warehouse compute (Snowflake, BigQuery), и dbt как стандарт для SQL-трансформаций. Сегодня >90% новых data stack'ов — ELT.
ETL — transform до load. Compute отдельный, warehouse «чист», raw layer'а нет. ELT — load raw, transform внутри warehouse. Compute = warehouse, raw layer всегда доступен для replay.
Один абзац разницы:
Sources → ETL Server (Informatica) → DWH (final tables only). Bug в transform → re-extract из source (часто невозможно).Sources → Ingestion (Fivetran) → S3 raw → Warehouse (raw → staging → marts via dbt) → BI / Reverse ETL. Bug? dbt run --full-refresh — raw layer всё помнит.Шипанная диаграмма (/s/etl-vs-elt) показывает обе эры рядом + PII-edge для compliance ADR:
pg (Postgres orders), stripe (Stripe API), segment (Segment events).informatica (PowerCenter), mssql (MS SQL DW final tables).fivetran (ingestion) → s3 (parquet, immutable) → Snowflake group.raw.* (landing) → stg (dbt views) → mart (incremental tables).dbt (dbt Cloud — SQL + Jinja).looker (BI), hightouch (Reverse ETL) → salesforce (CRM).pii-redactor (Spark, pre-load) — для compliance-сценария.Edges — только физические провода. Ответы и replay идут по тем же edges (reverse animation в FlowBuilder).
Informatica nightly batch: extract → transform на dedicated ETL server → load final shape в MS SQL DW. Bug в country mapping → re-extract из source (slow, sometimes impossible — source могла уже truncate'нуть старые rows). DWH compute был дорогой (Teradata $$$), поэтому transform держали off-warehouse. Эпоха «raw layer'а не существует».
Fivetran CDC из Postgres + Stripe API poll каждые 15min + Segment events → S3 partitioned parquet → COPY INTO Snowflake raw.orders (immutable history) → dbt run: raw → staging.stg_orders (view, минимальный cleanup) → marts.orders_summary (incremental table) → Looker dashboard. Bug? dbt run --full-refresh — raw layer на месте, replay бесплатный.
customer_segments (ML scores + cohorts) builds в marts; Hightouch читает changed rows; пушит update в Salesforce contact fields; sales reps видят ML-сегмент в CRM утром. Failure: backfill 100M rows → Salesforce API throttled → enable Hightouch rate limiting + batch sync. Reverse ETL — это «активация» данных: warehouse становится source of truth для operational систем.
EU GDPR: raw PII (emails, SSN) нельзя класть в Snowflake. Option A (pure ELT — mask в dbt) REJECTED: auditor находит PII в raw.* schema, compliance violation. Option B (ETL-style pre-load): Spark redactor hashes emails / drops SSN / tokenizes names; только masked rows достигают S3 → Snowflake raw.* безопасен (no PII ever there); dbt models continue как обычно. Decision: hybrid — ETL для PII step, ELT для всего остального.
Контекст. Команда выбирает архитектуру для нового аналитического стека. Source — Postgres + Stripe + Segment. Warehouse — Snowflake. Compliance — нужно соблюдать GDPR для EU customers.
Decision drivers:
| Driver | ETL favors | ELT favors |
|---|---|---|
| Cost of warehouse compute | High (Teradata, on-prem) | Low (Snowflake elastic) |
| Storage cost | High (no S3) | Low ($0.023/GB/mo) |
| Schema stability | Stable | Changing often |
| Who writes transforms | Data engineers (Python) | Analysts (SQL via dbt) |
| Compliance / PII | PII must not land raw | Non-sensitive data |
| Need for replay | Rare | Frequent (bug fixes) |
| Streaming requirements | Pre-aggregation на Flink | Snowpipe Streaming / micro-batch |
Choice: ELT по умолчанию, ETL hybrid для PII.
Sources → Fivetran → S3 → Snowflake (raw → stg → mart via dbt) → Looker / HightouchTrade-offs принятые:
incremental материализации.Стандартная стартап-стека 2026: Fivetran/Airbyte → Snowflake/BigQuery → dbt → Looker/Hex/Lightdash. Hightouch если нужна активация. Monte Carlo / Elementary для observability. Dagster или Airflow для orchestration.
not_null, unique, accepted_values, source freshness.staging → intermediate → marts.ELT не подходит, когда:
ETL не подходит, когда:
Ни ETL ни ELT не нужны, когда:
change-data-capture — фундамент streaming ETL/ELT, как Debezium читает WAL.iceberg-deltalake-hudi — современные table formats для S3 raw layer.data-mesh — domain-oriented decomposition data platform.lambda-vs-kappa — batch vs streaming архитектуры.Roundup blog — analytics engineering мысли.benn.substack.com — thought leadership по modern data stack.