Обратная засыпка воздушного потока препятствует захвату = True - PullRequest
1 голос
/ 22 июня 2019

Мне интересно, как именно airflow backfill работает, так как это поможет объяснить некоторые проблемы, которые у меня возникли с Airflow. Это просто запуск какого-то процесса планировщика, который не учитывает остальные группы обеспечения доступности баз данных и переопределяет start_date и end_date? Или это нечто большее?

Мой вариант использования: иногда я хочу перезапустить неделю для одного DAG, обычно, когда я добавляю в него новые функции. Для этого я использую CLI (airflow clear), чтобы очистить экземпляры задачи на нужные даты. Но иногда я могу передумать, думая, что сейчас не время для повторного запуска на этой неделе. Поэтому я приостанавливаю работу группы обеспечения доступности баз данных и использую команду airflow backfill -m, чтобы установить очищенные экземпляры задачи как успешные.

Когда я делаю это, соответствующие экземпляры задач переходят в состояние «неработоспособности» относительно поведения catchup=True. Если я удаляю их снова, они никогда не планируются, хотя их прогон DAG находится в состоянии «выполняется» (они сохраняют состояние «Нет»). Я сделал несколько тестов, и я на 90% уверен, что виновником является airflow backfill.

В конце концов, кажется логичным, что я не должен использовать airflow backfill в группе обеспечения доступности баз данных, которая имеет catchup=True, но это мой единственный способ отмечать успех для большого набора экземпляров задач. Кто-нибудь знает, изменяет ли эта команда состояние выполнения DAG, appart от установки его до запуска? У меня почему-то возникает ощущение, что он заменяет свои настройки захвата.

1 Ответ

0 голосов
/ 23 июня 2019

Хорошо, я думаю, что понял.

TL; DR >> Планировщик не запускает экземпляры задач с префиксом DAG с префиксом backfill_

Команда backfill запускает BackfillJob , который создаст прогоны DAG на указанные даты. В моем случае это фактически обновляет существующие прогоны DAG для этих дат. При этом он обновляет run_id этих прогонов DAG, заменяя префикс scheduled__ на backfill_.

Теперь, если я снова отключу запуск DAG, экземпляры задачи получат состояние None, и мой запуск DAG будет запущен. Но при проверке необходимости запуска экземпляров задачи планировщик не учитывает их, хотя прогон DAG находится в состоянии выполнения, поскольку этот прогон DAG имеет префикс backfill_ в своем идентификаторе. Это то, что if run.is_backfill делает в методе _process_task_instances SchedulerJob

Возможно, было бы неплохо иметь примечание об этом в пользовательском интерфейсе вместо обычного сообщения «этот экземпляр имеет все зависимости, которые должны быть выполнены в ближайшее время»:)

...