Airflow: Task Instance Failed — разбираем причины
TaskInstance упал, в логах стек трейс, дедлайн через час. Разбираем по порядку что произошло и как чинить.
Задача упала. В UI написано Failed, в логах что-то длинное. Первый рефлекс — нажать Clear и запустить заново. Иногда помогает, но обычно нет — и через 5 минут ты смотришь на тот же Failed только уже злее.
Давай по порядку.
Смотрим логи правильно
Airflow хранит логи в нескольких местах в зависимости от конфигурации. В стандартной установке:
# Через CLI
airflow tasks logs <dag_id> <task_id> <execution_date>
# Напрямую по пути
ls $AIRFLOW_HOME/logs/<dag_id>/<task_id>/
В Kubernetes executor логи живут в поде воркера — смотреть так:
kubectl logs -n airflow <pod-name> -c base
# или если под уже умер
kubectl logs -n airflow <pod-name> -c base --previous
Причины по частоте
1. OOMKilled — не хватило памяти
Самая частая причина в K8s. Pod убивает ядро, в логах обрывается на полуслове.
kubectl describe pod <pod-name> -n airflow | grep -A5 "OOMKilled"
# Или через события
kubectl get events -n airflow --sort-by='.lastTimestamp' | grep OOM
Решение — поднять лимит в KubernetesPodOperator или в конфиге executor:
# В DAG
KubernetesPodOperator(
...
container_resources=k8s.V1ResourceRequirements(
limits={"memory": "2Gi"},
requests={"memory": "1Gi"},
),
)
2. Timeout
Задача выполнялась дольше execution_timeout. Airflow её убил сам.
# Проверь в DAG
task = PythonOperator(
task_id='my_task',
execution_timeout=timedelta(hours=2), # вот это
...
)
Если задача объективно требует больше времени — увеличь. Если нет — значит что-то зависло внутри (запрос к БД без таймаута, внешний API, deadlock).
3. Connection refused / БД недоступна
airflow.exceptions.AirflowException: Could not connect to ...
Проверь Connection в Airflow UI → Admin → Connections. Потом проверь сеть:
# Из пода airflow worker
kubectl exec -it -n airflow <worker-pod> -- bash
curl -v <host>:<port>
4. Import error в DAG
Если DAG не импортируется, все его таски падают с невнятной ошибкой. Проверь:
airflow dags list-import-errors
# или
python /path/to/dag.py
5. Zombie task
Задача зависла и Airflow не может её убить. В логах тишина, в UI Running → Failed без причины.
# Находим zombie tasks
airflow tasks states-for-dag-run <dag_id> <run_id>
# Принудительно сбрасываем состояние
airflow tasks clear <dag_id> -t <task_id> -s <start_date> -e <end_date> --yes
Быстрый чеклист
- Смотришь логи (реальные, не в UI — там обрезает)
- Проверяешь ресурсы пода если K8s executor
- Проверяешь execution_timeout
- Проверяешь доступность внешних зависимостей
airflow dags list-import-errors
Если после всего этого причина не понятна — смотри логи scheduler, он видит больше чем UI показывает. Файл обычно в $AIRFLOW_HOME/logs/scheduler/.