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

Airflow Dynamic Task Mapping, XCom и backfill

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

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

Версии в источниках: Kafka/Connect/Streams 4.1, Debezium 3.3, Flink 1.20.3, Spark 4.0.1 и Airflow 3.1 либо явно названная система. Непроверенные вопросы и ограничения runtime — в журнале (архив рабочего проекта).

Механизм

Runtime mapping создаёт task instances из bounded metadata list; parse-time Python loop создаёт статическую topology. XCom передаёт небольшие serializable values; provider/object-storage XCom backend не делает bulk dataset в metadata бездумно безопасным.

flowchart TB
  Discover[Fixed source manifest] --> Expand[Mapped task instances]
  Expand --> Files[Generation-scoped files]
  Files --> XCom[Small URI count checksum metadata]
  XCom --> Check[Reduce and reconcile]
  Check --> Publish[Publish generation pointer]

Пошаговое объяснение

Discover фиксирует source manifest → mapped extract tasks получают source/interval/generation → outputs возвращают URI/count/checksum → reconciliation task читает manifests → publish выбирает validated generation. Retries повторяют тот же output identity, а изменённый source cut требует новой generation.

Failure scenarios и recovery

Backfill3.1 uses scheduler-managed runs и CLI backfill create, flags --from-date/--to-date/--reprocess-behavior. Dry-run показывает plan, не выполняет correctness validation. Catchup, task clear и backfill имеют разные scopes. Backfill output не добавляют безусловно к live aggregates.

Trade-offs и эксплуатация

Слишком крупная map list создаёт scheduler/DB pressure; ограничивать cardinality, pools и batch size metadata. Reduce task получает lazy mapped results; не материализовать огромные datasets через list() без оценки. Task mapping не обещает ordering completion.

Практический пример

Mapping и backfill имеют executable DAG/CLI и тестовые manifest data. Airflow2 backfill CLI здесь не используется.

Типичные ошибки проектирования

Смешивать source/state/sink boundaries, скрывать failed records и неопределённый исход timeout; применять retry без identity/version и retention contract. Конкретные ограничения разобраны выше.

Вопросы на собеседовании

expand выполняется при parse? Runtime expansion основана на доступном mapping input; это не произвольная генерация DAG в top-level.

Backfill может испортить live mart? Да, без отдельной generation/idempotent replacement и publish protocol.

Практические упражнения

Создайте два backfill runs одного интервала с разными code versions, запретите их смешение и определите approval-independent technical publish checks.

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