The cron-and-bash phase is fine — until it isn't
Every data team starts the same way: a Python script, a cron entry, a Slack notification on failure. That stack works for one or two pipelines. It breaks the moment you have ten, because cron has none of the things you need: dependency ordering, retries, backfills, observability, structured failure handling, scheduling visibility, run history. You either build all of that yourself or you adopt an orchestrator that already has it.
What every modern orchestrator gives you
- DAG / dependency graph — "task B runs after task A succeeds."
- Scheduling — cron-style or interval-based, with timezone-aware semantics.
- Retries — automatic, configurable, idempotent.
- Backfills — "run last week again, in order."
- Run history — every execution recorded with status, duration, logs.
- UI — see what's running, drill into failures, kick off manual reruns.
- Alerting — Slack/PagerDuty integrations on failure, SLA misses, etc.
The three contenders in 2026
Apache Airflow — most-deployed, biggest ecosystem, oldest of the three. Mature, opinionated, requires a real deployment (database, scheduler, webserver, workers). Best when you have lots of operators talking to many systems.
Dagster — asset-first model. You declare data assets and Dagster figures out the dependency graph. Best when your team thinks in terms of "the customers table" rather than "the customers ETL task."
Prefect — most Pythonic. Flows are decorated functions. Lightest deployment story (Cloud option, or self-host). Best when you want orchestration that feels like a library, not a platform.