Learning Platform
Глоссарий Troubleshooting
Урок 03.02 · 20 мин
Начальный
dbtsparkairflowdagstercomparison

dbt vs альтернативы

В data-стеке 2026 года вокруг dbt существует с десяток смежных инструментов, которые часто путают между собой. Этот урок отвечает на четыре практических вопроса:

  1. Чем dbt отличается от чистого SQL в скриптах?
  2. Чем dbt отличается от Spark / Databricks?
  3. Чем dbt отличается от Airflow / Dagster?
  4. Где границы, и когда использовать каждый инструмент?

Понимание этих границ снимает 90% путаницы про «зачем нам dbt, если у нас уже Airflow».


dbt vs raw SQL в скриптах

Базовый кейс: команда без dbt пишет трансформации как набор .sql-файлов, которые запускаются по очереди через bash-скрипт или crontab.

#!/bin/bash
# build_models.sh
psql -f stg_orders.sql
psql -f stg_customers.sql
psql -f int_orders_with_customers.sql
psql -f mart_orders.sql

Это работает на 5 моделях. На 50 — становится больно. На 500 — невозможно. Вот что отвалится:

Где ломается чистый SQL без dbt
Ручной orderПорядок выполнения хардкодится в bash-скрипте. Добавил модель — забыл вставить в скрипт — она не запускается, или запускается в неправильном порядке.
Хардкод namesИмена таблиц захардкожены в каждой модели: SELECT * FROM raw.stripe_payments. При смене схемы (dev / prod) — переписываем все файлы или передаём через переменные.
Нет тестовНет встроенного механизма для not_null/unique/relationships. Тесты пишутся вручную как отдельные SQL и запускаются отдельным скриптом.
Нет lineageЗависимости между моделями нигде не описаны явно. Чтобы понять, кто зависит от mart_orders, нужно grep'ом искать по всему репозиторию.
Нет dev/prodЕсли хочется dev-окружение со своими копиями таблиц, нужно вручную городить ifы по схеме или env variables.
Нет docsДокументация (что значит колонка amount_usd?) живёт где-то в Confluence и быстро становится stale.

dbt решает все шесть проблем сразу:

ПроблемаРешение в dbt
Ручной порядокref() строит DAG автоматически
Хардкод имёнref('stg_orders') -> dynamic resolution
ТестыGeneric tests (not_null, unique, relationships, accepted_values) + singular SQL tests
Lineagedbt docs serve рисует граф из manifest.json
Dev/prodprofiles.yml + target.name + custom_schemas
Docsdescriptions в YAML + dbt docs generate

Когда чистый SQL ещё годится: один аналитик, 5-10 моделей, нет команды. Как только модели начинают зависеть друг от друга и команда растёт — dbt окупается за неделю.


dbt vs Spark / Databricks

Spark и Databricks (managed Spark + storage + workspace) — это движки распределённой обработки данных. Они умеют то, что warehouse не умеют:

  • Прочитать 10 ТБ из S3 в Parquet и пересчитать
  • Запустить ML-модель inference на DataFrame
  • Стриминг через Spark Structured Streaming
  • Numerical computations на NumPy/pandas-уровне (с PySpark)

dbt и Spark пересекаются в одной плоскости: трансформация данных. Но они работают по-разному:

Apache Spark: общая картина и место в DE-стеке
АспектdbtSpark
ЯзыкSQL + JinjaScala / Python / SQL
ComputeWarehouse-native (Snowflake compute, BQ slots)Spark cluster
Лучше дляSQL-логика, бизнес-моделированиеETL на raw файлах, ML, streaming
Цикл разработкиPR со SQL-файлом, часыPR с Scala/Python, часы-дни
Кто пишетAnalytics engineerData engineer / ML engineer
StorageВнутри warehouseСырые файлы на object storage

Важный сценарий где они работают вместе: data engineer на Spark делает heavy lifting — читает миллиарды событий из Kafka, делает дедупликацию и обогащение, грузит в bronze/silver слой warehouse. Дальше analytics engineer на dbt делает gold-слой: бизнес-моделирование, тесты, marts для BI.

[Kafka / S3 events] -> [Spark — bronze/silver] -> [warehouse: silver tables]
                                                       ↓ (dbt берёт отсюда)
                                                [warehouse: dbt staging -> marts]

                                                  [BI / Tableau]

dbt поддерживает Python-модели на адаптерах Databricks/Snowpark/BigQuery/dbt-duckdb. Это не «dbt становится Spark» — это «dbt позволяет один шаг в графе сделать на Python там, где SQL не подходит». Например, посчитать косинусное расстояние между эмбеддингами.

WARNING

Распространённое заблуждение: «Spark = data engineering, dbt = analytics engineering, выбираем одно». На реальном production эти инструменты живут параллельно. Spark — для тяжёлой обработки сырых данных. dbt — для бизнес-моделирования поверх уже подготовленных данных. Это разные слои стека.


dbt vs Airflow / Dagster

Это самая частая путаница, потому что Airflow и Dagster тоже работают с DAG — но на другом уровне абстракции.

Airflow (и его аналоги Dagster, Prefect, Luigi, Mage) — это оркестратор. Он отвечает на вопрос: «в каком порядке и когда запускать задачи?». Каждая задача в Airflow — это произвольный код: shell-команда, Python-функция, BashOperator, KubernetesPodOperator.

dbt — это трансформер. Он отвечает на вопрос: «как трансформировать SQL-модели внутри warehouse и в каком порядке?». Все ноды dbt-DAG — это SQL-модели в warehouse.

Где dbt и Airflow в data-стеке
Airflow schedulerЗапускает по расписанию (cron). Здесь живёт верхне-уровневая оркестрация: «каждые 6 часов запусти Fivetran -> дождись -> запусти dbt -> дождись -> запусти ML training».
запускает по расписанию
Fivetran syncЗагрузка raw данных из source-систем
после
dbt runКоманда `dbt run` запускается как один из шагов Airflow DAG. Внутри dbt свой DAG из 200 моделей — но для Airflow это один task.
после
dbt test`dbt test` запускается отдельным шагом после run
после
ML trainingSagemaker / Databricks ML job

Иначе говоря: внутри одного Airflow task запускается команда dbt run, и она внутри себя строит и исполняет dbt-DAG из 200 моделей. Для Airflow это один task. Для dbt это полный граф.

Что делаетAirflow / Dagsterdbt
Уровень DAGPipelines (EL + dbt + ML + emails)SQL-модели внутри warehouse
НодаЛюбой code (Bash, Python, K8s pod)SQL модель
ШедулерCron / sensor / eventНе имеет; запускается извне
StateAirflow metadata DBmanifest.json + warehouse
ТестыКастомныеВстроенные (generic + singular)
ДокументацияCode commentsAuto-generated docs
ЗависимостиЯвно через set_upstreamАвтоматически через ref()

dbt НЕ заменяет Airflow. Если в production только dbt — нет шедулера. dbt-проект запускают извне: cron, Airflow, Dagster, GitHub Actions, dbt Cloud.

Airflow НЕ заменяет dbt. Если в production только Airflow — каждый SQL-таск пишется как BashOperator с inline SQL, без DAG между SQL-моделями, без тестов, без документации. Это «чистый SQL в скриптах» из предыдущего раздела, только с шедулером.

Airflow TaskFlow API: как выглядит оркестрация изнутри Apache Airflow: ключевые концепции для понимания связки Airflow + dbt

Связки в production:

  • Airflow + dbt-core: классика. Airflow запускает dbt run --select tag:hourly каждый час. Используется в большинстве компаний с собственной инфраструктурой.
  • Dagster + dbt-core: Dagster имеет нативную интеграцию через dagster-dbt, которая разворачивает dbt-DAG как Dagster assets. Каждая модель — отдельный Dagster asset. Лучшая observability, но требует больше инфраструктуры.
  • dbt Cloud Jobs: managed-вариант, dbt Labs сами шедулят. Дешёво для маленьких команд, дорого для больших.
  • Astronomer Cosmos (open-source): обёртка для Airflow, которая разворачивает dbt-DAG как Airflow tasks вместо одного big task. Каждая модель видна в Airflow UI.

Когда что выбирать

Условный матричный гид:

СценарийСтек
Один аналитик, 5-15 моделей, нет командыdbt-core с локальным DuckDB или managed warehouse, без оркестратора. Запускайте dbt run руками или через cron.
Команда 2-5 AE, 50-200 моделейdbt-core + Airflow / Dagster + warehouse (Snowflake / BigQuery). Это самая частая комбинация.
Команда 10+ AE, 500+ моделей, разные доменыdbt-core + Airflow + dbt Mesh (cross-project ref) + observability (Elementary / Monte Carlo)
Стартап без data-инженеровdbt Cloud (managed, со своим шедулером) + Fivetran для loading + BI
Streaming-кейсы (Kafka, near real-time)Spark Structured Streaming / Flink — НЕ dbt
ML / numerical computationsSpark / Databricks / Snowpark Python — может вызываться из dbt Python-моделей
Legacy ETL на больших raw файлах в S3Spark / Databricks для heavy lifting + dbt для последнего слоя

Что НЕ заменяет dbt

Чтобы закрыть тему: dbt не покрывает:

  • Loading (raw данные -> warehouse): Fivetran, Airbyte, Singer, custom Python
  • Orchestration верхне-уровневого пайплайна: Airflow, Dagster, Prefect
  • Streaming: Spark Streaming, Flink, Kafka Streams
  • ML serving: Sagemaker, Vertex AI, MLflow
  • BI / dashboards: Tableau, Looker, Metabase, Mode
  • Catalog / governance: DataHub, Atlan, Collibra (хотя dbt manifest часто кормит их)
  • Storage: object storage (S3) / warehouse storage — это отдельный layer

dbt — это узко-специализированный SQL-трансформер с DAG и тестами. Его сила — в фокусе. Не пытайтесь делать через dbt то, чего он не должен делать; и не пытайтесь заменить им оркестратор или BI-инструмент.

TIP

Если на вашем интервью спросят «расскажи разницу между dbt и Airflow», правильный ответ начинается с «они на разных слоях стека». dbt — трансформации внутри warehouse. Airflow — оркестрация пайплайнов всего стека. Они дополняют друг друга, не заменяют.


Попробуй сам

Нарисуйте на бумаге архитектуру типичной data-platform средней компании:

  1. Source-системы: Stripe API, Salesforce, application Postgres, Mixpanel events
  2. Loading: какой инструмент? (Подсказка: Fivetran/Airbyte)
  3. Warehouse: какой? (Snowflake / BigQuery)
  4. Трансформации: какой инструмент? (dbt)
  5. Оркестрация: какой инструмент? (Airflow / Dagster / dbt Cloud)
  6. BI: какой инструмент? (Tableau / Looker)

Нарисуйте, где каждый из них живёт, и какие стрелки между ними. Это пятиминутное упражнение покажет, что dbt — это один слой в десятислойном стеке, а не «универсальный инструмент данных».


Проверка знанийKnowledge check
Почему dbt и Airflow часто используются вместе, и какой именно слой каждый из них покрывает?
ОтветAnswer
dbt и Airflow покрывают разные слои стека и поэтому дополняют друг друга. Airflow — оркестратор верхнего уровня: он запускает по расписанию пайплайны, состоящие из произвольных задач (Fivetran sync, dbt run, ML training, отправка отчётов). Внутри одного Airflow task запускается команда dbt run, и для Airflow это один task. dbt — это специализированный трансформер для SQL-моделей внутри warehouse: внутри dbt run строится свой собственный DAG из десятков-сотен SQL-моделей, который dbt сам выполняет в правильном порядке через топологическую сортировку. Без Airflow dbt не имеет шедулера (его нужно вызывать извне). Без dbt каждый SQL-шаг пришлось бы писать как BashOperator с inline SQL, теряя DAG, тесты, документацию и lineage между моделями. Поэтому в типичной production-архитектуре они живут вместе: Airflow оркестрирует stack целиком, dbt трансформирует SQL внутри warehouse.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 6. Команда из 5 аналитиков пишет трансформации как 80 отдельных SQL-файлов, запускающихся последовательно через bash-скрипт. Что НЕ относится к ожидаемым проблемам такого подхода?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3