Собесов

DataLearn DE-101: Airflow vs Prefect vs Dagster — выбор оркестратора

Кейсы и метрикиOrchestrationЛёгкаяMiddle

Условие

Команда выбирает оркестратор. Сейчас 30 DAG'ов в Airflow 1.10, миграция предстоит в любом случае. Стоит ли остаться на Airflow 2/3 или перейти на Prefect/Dagster? Сформулируйте критерии и дайте рекомендацию.

Решение

Критерии выбора

  1. Зрелость и комьюнити — поддержка, документация, готовые операторы.
  2. Data-aware — понимает ли оркестратор сами данные (assets), а не только tasks.
  3. Локальная разработка / тестирование — насколько просто запустить пайплайн локально.
  4. UI и observability — что видно в проде при инциденте.
  5. Cost / managed-варианты — MWAA / Cloud Composer / Prefect Cloud.
  6. Кривая входа для команды.

Сравнение

Airflow Prefect Dagster
Парадигма DAG of tasks flows + tasks (Python-first) software-defined assets
Local dev сложнее просто (prefect server start) очень просто
Тестирование сложно легко очень легко
Зрелость очень высокая высокая средняя, растёт
Managed MWAA, Composer, Astronomer Prefect Cloud Dagster Cloud
Data-aware ограниченно (Dataset) через результаты да (assets — first-class)
Подходит для DBT да да да (нативно)
Команда знает почти все реже реже

Рекомендация

  • Если 30 DAG'ов уже на Airflow и команда им владеет — остаться на Airflow 2.x (миграция меньше). Astronomer / MWAA уберёт инфра-боль.
  • Если стек = dbt + Python + assets и команда любит «всё код, всё тестируется» — Dagster. Особенно если активная разработка пайплайнов.
  • Если хочется современного Pythonic-DX и нет легаси — Prefect 2.x.

Минусы каждого

Airflow:

  • DAG-файл выполняется при каждом scheduler tick — нельзя «тяжёлый» import.
  • XCom — антипаттерн для больших данных.
  • Тестирование сложное, тяжёлая зависимость от executor'а.

Prefect:

  • Меньше готовых интеграций, чем у Airflow.
  • API менялся между 1.x и 2.x.

Dagster:

  • Парадигма asset-first непривычна для пришедших из Airflow.
  • Меньше готовых операторов, чем у Airflow.

Пример Dagster asset

from dagster import asset, Definitions, define_asset_job, ScheduleDefinition
import pandas as pd
 
@asset
def orders_raw():
    return pd.read_sql("SELECT * FROM orders WHERE created_at::date = current_date - 1",
                       conn)
 
@asset
def orders_daily(orders_raw: pd.DataFrame):
    return orders_raw.groupby(orders_raw.created_at.dt.date).agg(
        n=("order_id", "count"), gmv=("amount", "sum")
    )
 
defs = Definitions(
    assets=[orders_raw, orders_daily],
    schedules=[ScheduleDefinition(
        job=define_asset_job("nightly", selection="*"),
        cron_schedule="0 0 * * *",
    )],
)

— те же три шага, но активы видны в каталоге и lineage строится автоматически.

Подводные камни

  1. «Миграция за квартал» — не получится. 30 DAG'ов с зависимостями переписать 3-6 месяцев + параллельная работа.
  2. Lock-in оркестратора через сложные кастомные операторы: чем толще обвязка, тем дороже переезд.
  3. Stateful operators (sensors) — Airflow sensors жгут слоты; в Prefect/Dagster — события.
  4. MWAA != self-hosted Airflow — есть ограничения по пакетам и DAG size.
  5. Airflow 1.x EOL — миграция в любом случае; не уходить «потому что страшно».
  6. Не путать Prefect 1 (Cloud2) и Prefect 2.x (Orion) — это разные продукты.

Эталонный ответ

При 30 готовых DAG — остаться на Airflow 2.x/3.x (минимальный объём миграции, зрелое комьюнити, MWAA/Astronomer покрывают инфру). Перейти на Dagster имеет смысл, если стек становится «dbt + assets» и хочется data-aware lineage. Prefect — для свежих Python-проектов без легаси. Главное — не переходить ради «модно», а считать стоимость миграции и команда-фит.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти