Airflow DAG, scheduling, data intervals и catchup¶
Тип материала: архитектурный разбор. Схемы и примеры иллюстративные, если не указано иное.
Версии в источниках: Kafka/Connect/Streams 4.1, Debezium 3.3, Flink 1.20.3, Spark 4.0.1 и Airflow 3.1 либо явно названная система. Непроверенные вопросы и ограничения runtime — в журнале (архив рабочего проекта).
Механизм¶
DAG задаёт зависимости задач; DAG run/task instances — конкретное исполнение. Timetable задаёт logical date и data interval. @daily scheduled run обычно обслуживает завершённый день, а не now() task worker. Timezone/DST меняют границы календарного интервала.
flowchart TB
Timetable --> Interval[Logical date and data interval]
Interval --> Run[Scheduled DAG run]
Run --> Task[Task dependencies and executor]
Task --> Bounds[Extract fixed half-open bounds]
Bounds --> Manifest[Interval and generation manifest]
Пошаговое объяснение¶
Versioned parse → scheduler создаёт interval run → dependencies становятся ready → executor запускает task → task читает [start,end) source scope → output manifest сохраняет тот же interval. catchup=False не делает историю полнее и не запрещает явный backfill.
Failure scenarios и recovery¶
Worker retry через сутки не должен незаметно сменить interval на текущий день. Manual/asset-triggered runs могут иметь иной interval contract; example требует time-based scheduled/backfill run и явно отклоняет отсутствие необходимых полей.
Trade-offs и эксплуатация¶
Pools/max_active_runs/concurrency ограничивают source нагрузку. Точное source snapshot согласуется в extraction job: расписание двух SQL queries не даёт общего consistent cut. Выделять orchestration delay, job processing и data freshness.
Практический пример¶
Mapped report DAG использует Task SDK3.1 context и generation path. Реальный scheduler/DagBag status указан отдельно от AST check.
Типичные ошибки проектирования¶
Смешивать source/state/sink boundaries, скрывать failed records и неопределённый исход timeout; применять retry без identity/version и retention contract. Конкретные ограничения разобраны выше.
Вопросы на собеседовании¶
logical_date — реальное время запуска? Нет.
catchup восстановит upstream удалённые данные? Нет, он создаёт runs; source availability и версии отдельны.
Практические упражнения¶
Сравните daily schedule в UTC и timezone с DST; определите source half-open bounds и idempotency для delayed retry.