Airflow DAG запускается дважды в понедельник для конфигураций ниже.

Когда я использую выражение cron 30 11 * * 1, DAG вообще не срабатывает. Итак, разобрался, я должен добавить к выражению еще одно *. 30 11 * * 1 * - Работает.

default_args:
'start_date': airflow.utils.dates.days_ago(1)

DAG: schedule_interval = 30 11 * * 1 *, ## Это еженедельный запуск в понедельник в 11:30.

Однако DAG запускается 2 раза каждый понедельник. С интервалом в 1 минуту:

  • 11:30:05
  • 11:30:58

В чем может быть возможная причина?

1
dmjani 11 Ноя 2019 в 21:33

3 ответа

6-значное выражение cron неверно, первое, что вы вводите, правильное. Сколько раз вы запускали DAG? Я предлагаю вам сначала запустить schedule_interval=@weekly и посмотреть, что произойдет?

0
SMDC 13 Ноя 2019 в 09:56
Сначала у меня было запланировано 5-значное выражение, которое никогда не запускалось. Затем я посмотрел на Airflow Document и увидел там всего 6 цифр с годом. Поэтому я изменил его на 6 цифр, и это вызвало DAG. Проблема в том, что он срабатывает дважды. И я понятия не имею, почему он это делает. Что может быть причиной?
 – 
dmjani
19 Ноя 2019 в 08:21

Парсер cron, который использует воздушный поток, интерпретирует 6-е место как секунды (как вы можете видеть здесь: https://github.com/kiorky/croniter/blob/master/src/croniter/tests/test_croniter.py#L14).

Я предполагаю, что ваш DAG завершится менее чем за минуту. В следующем цикле планировщика он видит, что расписание cron все еще совпадает (на 58-й секунде), поэтому он снова запускает DAG.

У меня была такая же проблема, потому что документация Airflow была связана с записью в Википедии о cron, в которой было 6 записей. 6 записей нестандартны, и существует более одной реализации. В любом случае, для Airflow шестая запись интерпретируется как секунды.

Ваше 5-местное выражение cron должно работать. Может попробовать еще раз? Однако измените идентификатор dag, иначе вы можете столкнуться со странным поведением: из https: //cwiki.apache.org/confluence/display/AIRFLOW/Common+Pitfalls: Changing schedule interval always requires changing the dag_id, because previously run TaskInstances will not align with the new schedule interval

0
brki 19 Ноя 2019 в 18:40

Итак, наконец, я разобрался в проблеме.

Да, это правильно, правильное 5-значное выражение cron. Я использую schedule_interval = 30 11 * * 1 #(Every Monday 11:30 UTC)

Это не сработало, потому что у меня было start_time:

'start_date': airflow.utils.dates.days_ago(1)

Я нашел этот блог на Airflow - Уловка, чтобы найти точную [start_date] с помощью выражения CRON здесь!

Если это еженедельная работа, ваша start_date должна быть неделю назад. Поэтому я изменил его на 'start_date': airflow.utils.dates.days_ago(7)

Теперь все работает нормально.

Спасибо!!!

0
dmjani 6 Дек 2019 в 07:19