Apache Airflow: Airflow 1.9.0 is queuing but not launching tasks
Ты видишь в UI серые квадратики задач, которые зависли в `queued`. Или вообще пустые, без статуса. В логах scheduler'а монотонно стучит `No tasks to consider fo
Ты видишь в UI серые квадратики задач, которые зависли в queued. Или вообще пустые, без статуса. В логах scheduler’а монотонно стучит No tasks to consider for execution. При этом метрики показывают, что нагрузка на планировщик в норме, а зависимости у задач выполнены.
Ты начинаешь копаться в конфигах, увеличивать threads, подозревать сеть или Redis. Но самое интересное — после рестарта scheduler’а задачи дружно побежали. Ненадолго.
Призраки в машине
В Airflow 1.9.0 был тихий, но мерзкий баг. Scheduler мог потерять связь с некоторыми своими процессами. Эти процессы становились “зомби” — они не выполняли работу, но продолжали занимать слоты в пуле.
Вот откуда берутся 4 потока scheduler’а и сообщение No tasks to consider for execution. Планировщик думает, что все его воркеры заняты, хотя на самом деле они просто повисли. Новые задачи встают в очередь и ждут своей участи, которой никогда не наступит.
[2018-02-28 02:24:58,780] {jobs.py:1077} INFO - No tasks to consider for execution.
Этот лог — крик души системы. Она хочет работать, но её собственные механизмы ей мешают.
Временные костыли и постоянное решение
Пока ты читаешь это, самый простой способ всё починить — это то, что ты уже случайно обнаружил.
# В твоём Docker-окружении
docker-compose restart scheduler
# Или в ECS через консоль или CLI
Задачи побегут. Потому что ты убил зомби-процессы. Но это не решение, а отсрочка. Через несколько часов или дней история повторится.
Второй шаг — проверить метаданные. Иногда задачи зависают в состоянии queued или без статуса из-за гонки условий в базе данных. Можно попробовать принудительно сбросить их.
-- Осторожно! Это для примера. Сначала сделай бэкап.
UPDATE task_instance
SET state='failed', end_date=NOW()
WHERE state='queued' AND start_date IS NULL AND NOW() - queued_dttm > INTERVAL '1 hour';
Это очистит застрявшие инстансы и позволит новым попыткам запуститься. Но корень проблемы останется.
Единственный настоящий выход — обновить Airflow. Баг был исправлен в более поздних версиях 1.10.x. Версия 1.9.0, особенно в связке с Celery и Redis, — это источник подобных головных болей.
Если же обновление прямо сейчас невозможно, установите жесткий график перезапуска scheduler’а через cron или средства оркестратора. Например, каждые 6 часов. Это признание поражения, но оно сохранит работоспособность.
Итог
Серые иконки и No tasks to consider for execution в Airflow 1.9.0 — это почти наверняка зомби-процессы scheduler’а. Лечение симптомов: рестарт scheduler’а и ручная чистка task_instance. Лечение причины: обновление до актуальной версии. Пока не обновился, настрой периодический рестарт — пусть это будет твой временный костыль.