Skip to content
About
Main content

Dataset-aware scheduling

What does depending on a dataset name instead of a job buy, and where does it stop?

Dataset-aware (data-driven) scheduling

The two earlier mechanisms bind a consumer to a producer, to its schedule or to its notification. binds it to an artifact name. Tasks declare their inputs and outputs (reads: sales.daily, writes: sales.daily), and the derives the arrows by matching names.

Rebinding

The gain is a rebinding, and it is the important part. A consumer no longer needs to know which job produces a table, how often it runs, or that it was rewritten last quarter. It needs to know only the table's name. Producer identity is separated from artifact identity. This is the same indirection as content-addressed storage (finding data by a hash of its content) or a service registry (finding a service by name). The second-order effect matters more than the first: cross-team dependencies stop requiring a conversation about schedules. They require only an agreement about a namespace.

A build system with a time axis

This is Make with time. (Make is the classic build tool: given a target and its declared dependencies, it works out what is out of date and rebuilds it.) The difference is instructive. Here the inputs are unbounded and constantly appended to, so "stale" cannot mean comparing file modification times. It must mean "a new version or exists that this consumer has not consumed." So the mechanism works only over stores that expose a version or partition-arrival signal. That is why it appeared together with modern table formats (formats such as Iceberg or Delta, which keep a snapshot history of a table) and not before them. Snapshot metadata is what makes this scheduling model possible.

Two limits

  1. Granularity. If a consumer declares a dependency on a whole table while its real dependency is one partition, every producer write wakes every consumer, and most of them then do nothing. The declaration is coarser than the truth. This is granularity mismatch causing amplification, appearing as spurious wake-ups instead of write amplification.
  2. No validation. The declaration is still unverifiable. A task that reads a table it did not declare gets no arrow and no error. The scheduler trusts the manifest. Only runtime capture can check it, and that is a separate system.

: it decouples consumers from producer identity, at the price of a declaration nobody validates and a granularity coarser than the real dependency.