Как не дать DAG засыпать? catchup_by_default = False и catchup = False, похоже, не работает и планировщик воздушного потока от обратной засыпки

Настройка catchup_by_default = False в airflow.cfg, похоже, не работает. Кроме того, добавление catchup = False в DAG тоже не работает.

Вот как воспроизвести проблему. Я всегда начинаю с чистого листа, выполняя airflow resetdb. Как только я снимаю паузу, задачи начинают заполняться.

Вот настройка дага. Я просто использую учебный пример.

default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": datetime(2018, 9, 16),
    "email": ["[email protected]"],
    "email_on_failure": False,
    "email_on_retry": False,
    "retries": 1,
    "retry_delay": timedelta(minutes=5),
}

dag = DAG("tutorial", default_args=default_args, schedule_interval=timedelta(1), catchup=False)

person Sam    schedule 05.09.2018    source источник
comment
Вы запускали airflow initdb снова после установки catchup_by_default=False в airflow.cfg?   -  person kaxil    schedule 07.09.2018
comment
Я почти уверен, что стер все, включая удаление тома докера и каждый раз заново запускал initdb. Это все еще не сработало. Вот почему это сбивает с толку. Я также пробовал как Sequential, так и Local Executer, хотя сомневаюсь, что это будет иметь значение.   -  person Sam    schedule 09.09.2018
comment
@kaxil Как только я отключаю DAG, он сразу же заполняется, даже если catchup = False для Dag и catchup_by_default = False.   -  person Sam    schedule 14.09.2018
comment
Это странно. Какую версию Airflow вы используете?   -  person kaxil    schedule 14.09.2018
comment
У меня версия 1.10.0.   -  person Sam    schedule 14.09.2018
comment
Я могу подтвердить, что вижу ту же проблему, что и @Sam, с v1.10.0   -  person harveyxia    schedule 15.11.2018


Ответы (3)


Чтобы быть ясным, если вы включили этот DAG, который вы указали, когда сейчас время 2018-10-22T9: 00: 00.000EDT (это то, что, 2018-10-22T13: 00: 00.000Z), он будет запущен через некоторое время после 2018-10-22T13: 00: 00.000Z с датой выполнения, отмеченной 2018-10-21T00: 00: 00.000Z.

Это не повторное заполнение с даты начала, но без какого-либо предыдущего прогона оно «догоняет» последний завершенный период действия; Я не уверен, почему так было в Airflow какое-то время, но это задокументировано, что catchup=False означает создание единственного прогона самого последнего действительного периода.

Если дата запуска dagrun еще больше сбивает вас с толку, пожалуйста, помните, что датой запуска является execution_date, который является началом периода интервала. Данные для интервала полностью доступны только в конце периода интервала, но Airflow предназначен для передачи в начале периода.

Тогда следующий запуск начнется где-то после 2018-10-23T00: 00: 00.000Z с execution_date, установленным как 2018-10-22T00: 00: 00.000Z.

Если 22-го или позже вы получаете дату запуска раньше, чем 21-е, или если запланировано несколько запусков, то да, catchup=False не работает. Но других сообщений об этом в ветке v1.10 или v1-10-stable нет.

person dlamblin    schedule 22.10.2018
comment
Я понимаю вашу точку зрения и понимаю, как это помогает с процессами ETL, которые полностью написаны на Airflow. Моя проблема в том, как использовать Airflow в качестве чистого планировщика, который запускает задания только тогда, когда наступает этот график. Например, если у нас есть задание, которое выполняется в 8:15 утра по UTC, если группа DAG выключена в это время и включена в 8:15 утра по UTC, оно не должно выполняться. В настоящее время я заметил, что даже с LatestOnlyOperator он выполняет задания, если он находится в start_date + some_schedule_period. Есть ли способ решить эту проблему / Airflow_feature? - person Suhas Hegde; 22.10.2018
comment
@SuhasHegde Это catchup=false поведение запуска одного самого последнего периода происходит только с новым dag, у которого нет предыдущих запусков, если вы отключите dag после того, как он запустился один раз, и включите его позже, он не будет догонять 8-8 утра, бег в 8:15, потому что не успел. Это плохой «чистый планировщик»; cron лучше для этого. Вы могли бы написать задания cron или jenkins, которые запускают dag через cli или веб-api, я не уверен, будет ли он запускать выключенный dag, я так не думаю. Для внешнего запланированного триггера следует установить schedule_interval=None. - person dlamblin; 23.10.2018
comment
Для меня, скажем так, у меня есть DAG с датой начала 1/1/2018 и графиком запуска @daily. Теперь это первый раз, когда я запускаю воздушный поток с новой базой данных. Ни один DAG никогда раньше не запускался. Как только я отключу DAG, планировщик запустит DAG, начиная с 01.01.2018, 1/2/2018, 1/3/2018, и так далее и так далее до настоящего момента. Я думал, что catchup = False остановит такое поведение. Я неправильно понимаю? - person Sam; 23.10.2018
comment
@Sam Вы правильно поняли, и это поведение похоже на какую-то ошибку, с которой вы столкнулись. Не могли бы вы изучить issues.apache.org/jira/projects/AIRFLOW/issues в файл с подробностями о проблеме? Также вы можете попытаться поднять это на apache-airflow.slack.com, у которого есть какой-то поток приглашений apache-airflow-slack.herokuapp.com - person dlamblin; 23.10.2018
comment
@dlamblin, Сейчас мы используем Cron и пытаемся перенести устаревшую систему на Airflow. Нам по-прежнему нужно, чтобы все работало только в соответствии с его Cron-расписанием, но при этом у нас есть преимущество доступа к пользовательскому интерфейсу, возможность запускать задания на нескольких кластерах, например, в облаке и т. Д. Вот почему этот вопрос актуален для меня. Я полагаю, что должен был упомянуть об этом раньше. - person Suhas Hegde; 23.10.2018
comment
@SuhasHegde Мне нравится Airflow; но для замены планировщика только веб-интерфейсом мне также нравится Jenkins, а если ваши задания основаны на Hadoop, у Hue есть Oozie с параметрами планирования. Наконец, Zeppelin может настраивать интерактивные записные книжки (такие как Jupyter, но для интерпретаторов, таких как Spark, Presto, Hive и т. Д.), Которые можно запланировать для обновления… не слишком хорошо для многих пользователей, но подходит для небольшой команды или отдельного человека. - person dlamblin; 24.10.2018
comment
Спасибо @dlamblin за ваши комментарии: Если 22-го или позже вы получите дату запуска раньше, чем 21-е, или запланировано несколько запусков, то да, catchup = False не работает.: - но, судя по моему тесту, он планирует два последних прогона (вместо одного, самого последнего). Я разместил код / ​​скриншоты здесь stackoverflow.com/questions/59260404/ - person Vibhor Jain; 10.12.2019
comment
@VibhorJain Да, я исправил это в github.com/apache/airflow/pull/8776 и выпустит это в Airflow 1.10.11 - person kaxil; 12.05.2020

Как упомянуто @dlamblin и как указано в документах тоже. Airflow создаст один DagRun для самого последнего допустимого интервала. catchup=False даст указание планировщику создать выполнение DAG только для самого последнего экземпляра серии интервалов DAG.

Хотя при использовании timedelta для schedule_interval вместо выражения CRON возникала ОШИБКА или предустановка CRON. Это было исправлено в Airflow Master с помощью https://github.com/apache/airflow/pull/8776. Мы выпустим Airflow 1.10.11 с этим исправлением.

person kaxil    schedule 11.05.2020

Я знаю, что эта ветка устарела. Но установка catch_up_default = False в airflow.cfg действительно остановила airflow от обратной засыпки для меня. (Моя Airflow версия - 1.10.12)

Я возмущаюсь, что эта конфигурация не установлена ​​на False по умолчанию. Это и тот факт, что метка начинается с schedule_interval после start_date, - две самые запутанные вещи, которые ставят в тупик новичков в Airflow.

В первый раз, когда я использовал Airflow, я потратил один день, пытаясь выяснить, почему моя тестовая задача, которая была запланирована на запуск каждые 5 минут, выполнялась с быстрой последовательностью (скажем, каждые 5-6 секунд). Мне потребовалось время, чтобы понять, что это backfill в действии.

person Varun Muriyanat    schedule 19.10.2020