Orchestration and DataOps
By the end of this module you will be able to:
- Explain what an orchestrator adds over cron
- Name the four changes in Airflow 3: DAG versioning, event-driven scheduling, data assets and the task execution interface
- Describe dbt as the SQL transformation standard with tests, docs and lineage
- Describe CI/CD for data: environments, tests in CI and promotion gates
- Read the 2025 to 2026 consolidation story and its open-standard hedges
The DataOps loop makes changing production boring and repeatable
A change earns production by going round one circuit every time, and every connector names the artefact in flight, a pull request, a green build from CI, a release candidate, so the gate is the one point where a change can be stopped and promotion moves it on unchanged.
A change earns production by going round one circuit every time: develop, test in CI, deploy to staging, pass the gate, promote, observe, improve. The loop is what makes a release boring, and boring is the point.
Three promotion gates stand between a change and production
Development checks the schema diff, staging checks row counts and freshness against real data, production checks the breaking-change policy and an owner sign-off, and all three fail into one return lane, sending a change back named by the check it failed.
Promotion is earned gate by gate: development checks the schema diff and the model tests, staging checks row counts and freshness against real data, production checks the breaking-change policy and an owner sign-off. Any failure sends the change back to develop with the failing check named.
The dashboard was green all morning. The data behind it was yesterday's.
A retailer loaded its sales warehouse with nine scheduled jobs. Extract at two in the morning, stage at three, transform at four, aggregate at five, publish at six. One night the extract took ninety minutes longer than usual because an upstream system was under load. The staging job started on time, found the previous day's file, and processed it perfectly. So did every job after it. All nine reported success.
Nobody noticed for eleven days, because the report looked normal and the failure had no error to raise. A schedule expresses when a job should start. It cannot express that this job depends on that one having finished, and that gap is where the eleven days lived.
Every scheduled job reported success. The report was still wrong. Where does a schedule of independent jobs stop being enough?
Data engineering has spent two decades learning something software engineering learned earlier: that the hard part is not writing the transformation, it is changing it safely afterwards while it is running in production and other people are depending on the output. Orchestration is how a set of steps becomes a system that knows its own shape. DataOps is how a change to that system becomes an ordinary, reviewed, reversible event rather than an act of nerve.
Almost every data platform starts with scheduled scripts, and almost every one outgrows them for the same three reasons. Naming those reasons is the fastest way to understand what the orchestration layer is for.
23.1 What an orchestrator adds over cron
Cron answers one question: what should start at this time. That is genuinely useful, and for a single independent job it is sufficient. answers a different set of questions, and each of them is one that a schedule cannot express.
- Dependency, not timing. The orchestrator knows that aggregation runs after transformation because transformation produces what aggregation reads, rather than because one is set for four and the other for five. When the upstream step runs late, the downstream step waits instead of processing stale input.
- State that survives the run. The orchestrator records that this run, for this logical date, reached this step and failed there with this message. Cron records an exit code in a log file that nobody reads.
- Retry, backfill and catch-up. A failed step can be retried with a policy rather than by hand. A range of missed dates can be rerun as a first-class operation. A pipeline that was switched off for three days can be brought back up to date deliberately rather than accidentally.
- Observability of the run itself. How long each step took, how that compares with its own history, which step is on the critical path, and which downstream consumers are still waiting.
Underneath all of this sits one structure. A is a set of tasks with arrows showing which must finish before which, and no path that loops back on itself. The acyclic property is what guarantees a run terminates and what lets the orchestrator work out a safe running order and what may run in parallel. It is also what makes a failure traceable: every task has a known set of predecessors, so the first failing step is the cause and everything after it is a symptom.
Two properties matter more than any orchestrator feature, because without them retries and backfills are dangerous rather than useful. A task should be idempotent, meaning that running it twice for the same logical date leaves the same result as running it once. And it should be partitioned by that logical date, so a rerun replaces one day rather than appending a second copy of it. A task that appends without a partition key will double the day it reruns, and the retry policy that was meant to protect the pipeline becomes the thing that corrupts it.
Common misconception
“We do not need an orchestrator because our jobs already run reliably on a schedule.”
Reliability of individual jobs is not the problem an orchestrator solves. The problem is the silent success: a downstream job that runs on time, reads whatever happens to be there, and reports success on stale input. A schedule cannot detect that because the schedule never knew the dependency existed. What you are relying on instead is a timing margin, and timing margins are consumed by growth without anyone deciding to consume them.
Airflow changed shape in 2025, and each of the four headline changes answers a failure that a schedule of independent jobs cannot see.
23.2 Airflow 3 and the 2025 shift
Apache Airflow 3.0 was released on 22 April 2025. The project's own release announcement puts its reach at over 30 million monthly downloads and 80,000 organisations, which is why a change to Airflow is worth reading as a statement about the category rather than as one vendor catching up.
- DAG versioning. A run is now tied to the version of the code it started with, so a run completes on the definition it began with even if a new version is uploaded while it is in flight. Before this, editing a pipeline during a long run could leave a single execution half-built by two different definitions, which made a failure very hard to reason about after the fact.
- Event-driven scheduling. Airflow can react to events happening outside Airflow, including data assets being created or updated by external systems. Work can therefore be triggered by data becoming ready rather than by the clock alone, which is what removes the reliance on a timing margin that the retailer above never knew it had.
- Data assets. The unit the platform reasons about shifts from the task towards the dataset the task produces. A downstream pipeline declares the assets it consumes, and the orchestrator schedules it when those assets are refreshed. This is the same idea as a dependency graph, expressed in the vocabulary of the data rather than of the jobs.
- A task execution interface. A client and server split that allows tasks to execute in other environments and other languages, so the orchestrator stops being the thing that has to host every dependency your transformations need.
The direction of travel across all four is the same. The orchestrator is becoming less of a timetable and more of a graph of data assets that knows what is fresh, what depends on it, and which version of the code produced it. If you are choosing an orchestrator today, that is the shape to compare against, whether the product is Airflow, Dagster, Prefect or a managed cloud service.
Orchestration decides when work runs. Something still has to define the transformations themselves, and over the last decade one way of doing that became the default for warehouse work.
23.3 dbt as the SQL transformation standard
dbt is a transformation framework in which each model is a select statement in a file, and the tool takes care of materialising it as a table or a view in the warehouse. It matters less as a product than as a shape, because that shape is now what most warehouse transformation looks like whether or not the tool itself is used.
The idea that carries the weight is that models refer to each other by reference rather than by hard-coded table name. Because every dependency is declared in the code, the tool can derive the DAG from the project itself instead of asking an engineer to maintain a separate graph. That single decision produces four things that used to be separate projects.
- A build order for free. The graph is inferred, so the correct order and the safe parallelism come from the code rather than from a document that drifts.
- in the same repository. Assertions live beside the model they test. dbt ships four generic tests out of the box, checking that a column is unique, that it is not null, that its values come from an accepted list, and that a foreign key actually resolves to a row in the referenced model. Anything more specific is written as a select statement that returns the failing rows, so a test passes when it returns nothing.
- Documentation generated from the project. Descriptions written against models and columns are published as a browsable site, so the documentation is produced from the same commit as the code rather than maintained separately and left behind.
- as a by-product. Because dependencies are declared, the tool can answer what feeds this model and what breaks if I change it, which is exactly the question that teams without lineage answer by asking around and hoping.
The wider point outlives any one tool. Transformations written as reviewed, tested, version-controlled code behave like software. Transformations written as ad hoc statements executed against production behave like an accident waiting for an audience. That discipline is what names.
Common misconception
“If all our models have tests, our data quality problem is solved.”
A test only catches a failure that somebody predicted and wrote down. The incidents that damage trust are usually the ones nobody imagined: a source system starts sending amounts in a different currency, a category is quietly renamed upstream, a join that used to match ninety-nine per cent of rows starts matching sixty. Testing is the floor. Continuous monitoring of freshness, volume, schema and distribution is what sits above it, and the two are not substitutes.
Code in a repository is only half the discipline. The other half is what happens between a change being written and that change reaching the tables people report on.
23.4 CI/CD for data
applies continuous integration and delivery to transformation code. When a pull request is opened, the changed models and the models downstream of them are built and tested in a temporary schema, and the result is reported back on the request before anyone merges. Delivery then promotes that same reviewed code onward through the environments and gates described below.
The environments come first, because everything else depends on them. At minimum you need three: a development environment where each engineer builds into their own schema and can break things freely, a staging environment that runs against production-shaped data on the production schedule, and production itself. The same code runs in all three; only the target schema and the credentials differ. If a change can only be tested by running it in production, you do not have a deployment process, you have a habit.
Building only what changed and what depends on it is the practical trick that makes this affordable. Rebuilding an entire warehouse on every pull request is too slow and too expensive to survive contact with a real team, so the pipeline uses the same dependency graph that produced the build order to work out the smallest set of models that could possibly be affected, and tests that.
Three gates then stand between a change and production.
- The development gate. The schema difference is reviewed by a human who owns the model, and the unit-level assertions pass. This is where a is named as one: removing a column, renaming one, tightening a type, or changing what a field means. Adding an optional field is not breaking; removing a field always is.
- The staging gate. The change runs against realistic volumes, and row-count and freshness assertions are checked. Logic that was correct on ten rows of sample data frequently is not correct on ten million rows with the awkward cases included.
- The production gate. A breaking change needs a migration plan and a named owner signing it off, because at this point the cost of the change falls on consumers rather than on the team making it.
A is what turns that third gate from a conversation into a check. Because the contract is a machine-readable file describing schema, quality expectations, service levels and ownership, the build can compare a proposed change against it and fail the pull request rather than waiting for a consumer to notice in production.
“program testing can be a very effective way to show the presence of bugs, but is hopelessly inadequate for showing their absence”
Edsger W. Dijkstra, The Humble Programmer (1972) - ACM Turing Award lecture, EWD340
Dijkstra was writing about programs, but the sentence transfers to data without modification. A passing test suite tells you that the failures somebody thought of are not present today. It says nothing about the failure nobody thought of, which is why gates and tests need continuous monitoring of the data alongside them rather than instead of them.
Gates only work if you can tell what a change affects. That question is answered by lineage, and lineage stopped being a per-vendor feature when a standard for collecting it appeared.
23.5 Lineage as the connective tissue
An orchestrator knows which tasks ran. A transformation tool knows which models depend on which. Neither on its own can tell you that the finance dashboard reads a column you are about to rename, because the chain crosses tool boundaries. Runtime lineage closes that gap by having each tool emit what it read and what it wrote as it runs, into a shared format.
is the version worth insisting on. Table-level lineage tells you that a report reads this table, which in a wide table is nearly always true and therefore nearly useless. Column level tells you whether the specific field you are changing is one that the report actually consumes, which is the difference between a change request that takes an afternoon and one that stalls for a fortnight while somebody checks.
“OpenLineage is an open framework for data lineage collection and analysis.”
OpenLineage documentation - Project overview
The value of a standard here is not elegance, it is maintenance. Before it, each project instrumented its own collection integration and each of those integrations broke on new versions of the underlying scheduler or processing framework. A shared specification of dataset, job and run entities lets the integration effort be shared and lets it live inside the tools rather than bolted onto them.
The tools described so far belonged to separate vendors for most of the last decade. They no longer do, and a practitioner needs to read that change without either panicking about it or ignoring it.
23.6 Consolidation and the open-standard hedges
The modern data stack was assembled from specialists. One vendor moved data in, another transformed it, a third pushed results back out to operational systems, a fourth catalogued it. Between 2025 and 2026 those layers were pulled together. On 1 May 2025 Fivetran, an ingestion vendor, announced that it had signed an agreement to acquire the reverse-ETL company Census, subject to closing conditions. On 13 October 2025 Fivetran and dbt Labs announced an all-stock merger, which completed on 1 June 2026, placing ingestion, transformation and activation inside one company alongside a rewritten dbt execution engine named Fusion.
It is not obvious that this is bad. Fewer seams means fewer places where lineage is lost and fewer integrations to keep alive. But the buying position changes. When ingestion, transformation and the semantic layer are one product, the cost of leaving is no longer the cost of replacing one component; it is the cost of replacing the whole chain at once. The professional response is neither to refuse consolidated tools nor to hand over the whole estate, but to keep the exit cheap by making the parts that matter conform to open specifications.
Four hedges do most of that work, and all four are things you can require in a procurement.
- An for storage. If the tables are Iceberg in object storage you own, the data survives a change of engine because the engine was never where the data lived.
- OpenLineage for lineage. Lineage emitted to a standard specification is portable. Lineage held in a vendor graph is not, and it is usually the first thing you lose in a migration.
- The Open Data Contract Standard for interfaces. Contracts expressed in a platform-agnostic file describe the promise between producer and consumer independently of whoever is currently executing it.
- An open metric specification for the . The Open Semantic Interchange initiative, launched on 23 September 2025, exists so metric definitions can be written once in vendor-neutral form rather than re-encoded in each tool that consumes them.
None of these is free. Each adds a specification to learn and a conformance requirement to enforce. The question to ask of any one of them is what it would cost to move off this vendor in three years, and whether that number is one you would be willing to show the person who signs the contract.
A nightly pipeline runs five cron jobs at fixed times. One night the first job takes two hours longer than usual. Every job reports success and the morning report looks normal, but the figures are a day old. What is the underlying defect?
An engineer wants to rerun three days of a pipeline that was switched off during an incident. What property of the tasks determines whether that backfill is safe?
A team is moving to a single vendor that provides ingestion, transformation and the semantic layer. Which measure most reduces the cost of leaving that vendor later?
Core distinctions
- Cron expresses when a job starts. An orchestrator expresses what depends on what, keeps run state, supports retry and backfill as first-class operations, and makes the run itself observable. The failure cron cannot detect is the silent success on stale input.
- Backfill and retry are only safe when tasks are idempotent and partitioned by logical date. A task that appends without a partition key duplicates every day it reruns.
- Airflow 3.0, released on 22 April 2025, added DAG versioning so a run completes on the code version it started with, event-driven scheduling so work can be triggered by data becoming ready, data assets as the scheduling unit, and a task execution interface allowing tasks to run in other environments and languages.
- dbt made warehouse transformation behave like software by having models reference each other, which lets the build order, the tests, the documentation and the lineage all be derived from the same project rather than maintained separately.
- CI/CD for data needs three environments running the same code, a build limited to what changed and what depends on it, and three gates: schema review, staging against realistic volumes, and a breaking-change plan with an owner. A data contract turns the third gate into an automated check.
- Ingestion, transformation and activation consolidated into one vendor between 2025 and 2026. Keep the exit affordable by holding tables in an open table format in storage you own, and by requiring lineage, data contracts and metric definitions in open specifications.
Standards and sources cited in this module
Apache Airflow 3.0 release announcement (Apache Software Foundation)
DAG versioning, event-driven scheduling, data assets, task execution interface
The primary account of the April 2025 release and the clearest short statement of where orchestration moved: from a timetable of tasks to a graph of data assets with versioned runs.
dbt documentation: data tests (dbt Labs)
Generic and singular data tests
Defines data tests as assertions made about models and other resources, and documents the four generic tests. The reference for what belongs in the repository alongside a transformation.
Project overview and the dataset, job and run model
The open standard for runtime lineage collection, with integrations across schedulers and processing frameworks. The portable alternative to lineage held inside one vendor's graph.
Open Data Contract Standard (Bitol)
Version 3.1.0, contract sections
A platform-agnostic file format covering schema, data quality, service levels, roles and infrastructure, which is what makes a producer-to-consumer promise checkable in a build rather than only discussable in a meeting.
Fivetran signs agreement to acquire Census (Fivetran press release)
Oakland, 1 May 2025
The primary record of the first step in the consolidation, and the reason to say signed agreement rather than completed acquisition: the release states that completion was subject to customary closing conditions.
Fivetran and dbt Labs complete merger (Fivetran press release)
Merger completion, 1 June 2026
The primary record of the merger: announced on 13 October 2025 as an all-stock transaction and completed on 1 June 2026, placing data movement and transformation in one company.
Announcement of 23 September 2025
The source for the launch date and the stated purpose of the initiative: a vendor-neutral specification for how semantic metadata is defined and shared between tools.
The Humble Programmer (Edsger W. Dijkstra, EWD340)
ACM Turing Award lecture, 1972
The origin of the observation that testing shows the presence of defects and not their absence, which is the argument for pairing assertions with continuous monitoring rather than treating a green test suite as proof.
Module 23 of 52 · Engineering and platforms