Errors
airflow

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

Быстрый чеклист

  1. Смотришь логи (реальные, не в UI — там обрезает)
  2. Проверяешь ресурсы пода если K8s executor
  3. Проверяешь execution_timeout
  4. Проверяешь доступность внешних зависимостей
  5. airflow dags list-import-errors

Если после всего этого причина не понятна — смотри логи scheduler, он видит больше чем UI показывает. Файл обычно в $AIRFLOW_HOME/logs/scheduler/.