Перейти к содержанию

Airflow DAG, scheduling, data intervals и catchup

Глубокие темы · Раздел03

Тип материала: архитектурный разбор. Схемы и примеры иллюстративные, если не указано иное.

Версии в источниках: 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.

Дополнительные источники