Solucionar problemas del activador de Airflow

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

En esta página se proporcionan pasos para solucionar problemas habituales con el activador de Airflow e información sobre ellos.

Bloquear operaciones en el activador

En ocasiones, las tareas asíncronas pueden bloquearse en los activadores. En la mayoría de los casos, los problemas se deben a que no hay suficientes recursos de activador o a problemas con el código del operador asíncrono personalizado.

Los registros de activadores muestran los mensajes de advertencia que pueden ayudarte a identificar las causas principales de la disminución del rendimiento de los activadores. Hay dos advertencias importantes que debes tener en cuenta.

  1. Hilo asíncrono bloqueado:

    Triggerer's async thread was blocked for 1.2 seconds, likely due to the
    highly utilized environment.
    

    Esta advertencia indica que hay problemas de rendimiento debido a un gran volumen de tareas asíncronas.

    Solución: para solucionar este problema, sigue estos pasos:

    • Ajusta los parámetros de los activadores para asignar más recursos a los activadores o aumentar el número de activadores de tu entorno.
    • Reduce el número de tareas diferidas que se ejecutan al mismo tiempo.

    Aunque los activadores gestionan las tareas aplazables, los trabajadores de Airflow son los responsables de iniciar y completar cada tarea. Si vas a ajustar el número de activadores, también te recomendamos que escales el número de tus instancias de trabajador.

  2. Una tarea específica ha bloqueado el hilo asíncrono:

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done,
    defined at /opt/***/***/jobs/example.py:609> result=None> took 0.401
    second
    

    Esta advertencia señala un fragmento específico de código de operador ejecutado por Cloud Composer. Los activadores se basan en la biblioteca asyncio para ejecutar operaciones en segundo plano. Una implementación personalizada de un activador puede no cumplir correctamente los contratos de asyncio (por ejemplo, debido a un uso incorrecto de las palabras clave await y async en el código de Python).

    Solución: Inspecciona el código que indica la advertencia y comprueba si la operación asíncrona se ha implementado correctamente.

Demasiados activadores

El número de tareas aplazadas se muestra en la métrica task_count, que también aparece en el panel de control Monitoring de tu entorno. Cada activador crea algunos recursos, como conexiones a recursos externos, que consumen memoria.

Tareas aplazadas mostradas en el panel de control Monitorización
Figura 1. Tareas aplazadas que se muestran en el panel de control Monitorización (haz clic para ampliar)

Los gráficos de consumo de memoria y CPU indican que los reinicios se deben a que no hay suficientes recursos, ya que la sonda de vivacidad falla porque faltan latidos:

El activador se reinicia porque no hay suficientes recursos
Figura 1. El activador se reinicia debido a que no tiene suficientes recursos (haz clic para ampliar)

Solución: para solucionar este problema, sigue estos pasos:

  • Ajusta los parámetros de los activadores para asignar más recursos a los activadores o aumentar el número de activadores de tu entorno.
  • Reduce el número de tareas diferidas que se ejecutan al mismo tiempo.

Fallo de un trabajador de Airflow durante la ejecución de la retrollamada

Una vez que el activador termina la ejecución, el control vuelve a un trabajador de Airflow, que ejecuta un método de retrollamada mediante un espacio de ejecución. El Celery Executor controla esta fase, por lo que se aplican los límites de recursos y la configuración correspondientes (como parallelism o worker_concurrency).

Si el método de retrollamada falla en el trabajador de Airflow, el trabajador falla o el trabajador que ejecuta el método se reinicia, la tarea se marca como FAILED. En este caso, la operación de reintento vuelve a ejecutar toda la tarea, no solo el método de devolución de llamada.

Bucle infinito en un activador

Es posible implementar un operador de activador personalizado de forma que bloquee por completo el bucle del activador principal, de modo que solo se ejecute el activador roto en ese momento. En este caso, se genera una advertencia en los registros del activador después de que finalice el activador problemático.

No se ha encontrado la clase de activador

Como la carpeta DAGs no está sincronizada con el activador de Airflow, falta el código del activador insertado cuando se ejecuta el activador. El error se genera en los registros de la tarea fallida:

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

Solución: importar el código que falta de PyPI.

Mensaje de advertencia sobre el activador en la interfaz de usuario de Airflow

En algunos casos, después de inhabilitar el activador, puede que veas el siguiente mensaje de advertencia en la interfaz de usuario de Airflow.

The triggerer does not appear to be running. Last heartbeat was received
4 hours ago. Triggers will not run, and any deferred operator will remain
deferred until it times out or fails.

Airflow puede mostrar este mensaje porque quedan activadores incompletos en la base de datos de Airflow. Este mensaje suele indicar que el activador se ha inhabilitado antes de que se completaran todos los activadores de tu entorno.

Para ver todos los activadores que se están ejecutando en el entorno, consulta la página Buscar > Activadores en la interfaz de usuario de Airflow. Se requiere el rol Admin.

Soluciones:

Las tareas permanecen en el estado aplazado después de que se inhabilite el activador

Cuando el activador está inhabilitado, las tareas que ya están en el estado aplazado permanecen en este estado hasta que se agota el tiempo de espera. Este tiempo de espera puede ser infinito, en función de la configuración de Airflow y del DAG.

Usa una de las siguientes soluciones:

  • Marca manualmente las tareas como fallidas.
  • Permite que el activador complete las tareas.

Te recomendamos que inhabilites el activador solo si tu entorno no ejecuta ningún operador o tarea diferida y todas las tareas diferidas se han completado.

Siguientes pasos