Apache Airflow: Refreshing dags without web server restart Apache Airflow
Ты внес правки в DAG, нажал сохранить и бежишь в интерфейс Airflow. А там — ничего. Старая версия, будто ты ничего и не менял. Мысль о restart webserver вызывае
Ты внес правки в DAG, нажал сохранить и бежишь в интерфейс Airflow. А там — ничего. Старая версия, будто ты ничего и не менял. Мысль о restart webserver вызывает легкую панику, потому что это время и потенциальные алерты.
Но перезагружать веб-сервер не нужно. Почти никогда.
Кто тут главный по дагам
За загрузку и парсинг DAG файлов отвечает scheduler. Он сканирует папку dags/ с интервалом, который ты задал в dag_dir_list_interval. Каждые N секунд он заглядывает в папку, находит новые файлы или изменения в старых, парсит их и складывает результат в свою базу.
Веб-сервер — это лишь клиент. Он не ходит в файловую систему за дагами. Он берет уже сериализованные данные из базы данных метаданных Airflow и показывает тебе в UI. У него есть свой кэш.
Поэтому вопрос «как обновить даги» распадается на два: как заставить scheduler увидеть изменения быстро и как заставить webserver показать свежие данные.
Команда, которую ты искал
Scheduler сам подхватит изменения при следующем сканировании папки. Но если ждать пять минут — не вариант, можно дать ему прямой пинок.
Вот команда, которая заставляет scheduler перечитать файлы дагов и обновить их представление в базе:
airflow dags reserialize
После ее выполнения scheduler перезапишет сериализованные даги в базе. Но веб-сервер все еще может показывать старые данные из своего кэша. Его кэш тоже нужно сбросить.
Вот так можно заставить webserver обновиться:
airflow dags list
Эта команда, запущенная на той же ноде, где работает веб-сервер, инвалидирует его кэш. Страница UI должна обновиться сама через несколько секунд, либо ее нужно перезагрузить вручную.
Если нужно совсем быстро
Стандартный интервал сканирования в 300 секунд — для прода это нормально. Но для разработки или тестов можно сделать его агрессивным.
Выставь переменную окружения для scheduler:
AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL=30
Или в airflow.cfg:
[scheduler]
dag_dir_list_interval = 30
Теперь scheduler будет проверять папку каждые 30 секунд. Вместе с командой reserialize это дает почти мгновенное обновление.
Что запомнить
Restart webserver — это архаичный способ, почти всегда излишний. Современный Airflow управляется через scheduler.
Порядок действий: вносишь изменения в файл дага, запускаешь airflow dags reserialize, затем airflow dags list. Обновляешь страницу UI. Все должно работать.
Если нет — значит, проблема глубже. Возможно, ошибка импорта, которую scheduler не смог вычитать. Но это уже другая история.