Условие
Команда выбирает оркестратор. Сейчас 30 DAG'ов в Airflow 1.10, миграция предстоит в любом случае. Стоит ли остаться на Airflow 2/3 или перейти на Prefect/Dagster? Сформулируйте критерии и дайте рекомендацию.
Решение
Критерии выбора
- Зрелость и комьюнити — поддержка, документация, готовые операторы.
- Data-aware — понимает ли оркестратор сами данные (assets), а не только tasks.
- Локальная разработка / тестирование — насколько просто запустить пайплайн локально.
- UI и observability — что видно в проде при инциденте.
- Cost / managed-варианты — MWAA / Cloud Composer / Prefect Cloud.
- Кривая входа для команды.
Сравнение
| 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 строится автоматически.
Подводные камни
- «Миграция за квартал» — не получится. 30 DAG'ов с зависимостями переписать 3-6 месяцев + параллельная работа.
- Lock-in оркестратора через сложные кастомные операторы: чем толще обвязка, тем дороже переезд.
- Stateful operators (sensors) — Airflow sensors жгут слоты; в Prefect/Dagster — события.
- MWAA != self-hosted Airflow — есть ограничения по пакетам и DAG size.
- Airflow 1.x EOL — миграция в любом случае; не уходить «потому что страшно».
- Не путать Prefect 1 (Cloud2) и Prefect 2.x (Orion) — это разные продукты.
Эталонный ответ
При 30 готовых DAG — остаться на Airflow 2.x/3.x (минимальный объём миграции, зрелое комьюнити, MWAA/Astronomer покрывают инфру). Перейти на Dagster имеет смысл, если стек становится «dbt + assets» и хочется data-aware lineage. Prefect — для свежих Python-проектов без легаси. Главное — не переходить ради «модно», а считать стоимость миграции и команда-фит.