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 volumen elevado de tareas asíncronas.

    Solución: Para solucionar este problema, asigna más recursos a los activadores, reduce el número de tareas diferidas que se ejecutan al mismo tiempo o aumenta el número de activadores de tu entorno. Ten en cuenta que, aunque los activadores gestionan las tareas aplazables, son los trabajadores los que se encargan de iniciar y completar cada tarea. Si ajustas el número de activadores, también deberías escalar 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/my-custom-code.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 deben usar 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 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 puede ver en la métrica task_count, que también se muestra en el panel de control Monitoring de tu entorno. Cada activador crea algunos recursos, como conexiones a recursos externos, que consumen memoria.

Tareas aplazadas que se muestran en el panel de control Monitorización
Figura 1. Tareas aplazadas que se muestran en el panel de control Monitor (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
Imagen 2. El activador se reinicia debido a que no tiene suficientes recursos (haz clic para ampliar)

Solución: Para solucionar este problema, asigna más recursos a los activadores, reduce el número de tareas diferidas que se ejecutan al mismo tiempo o aumenta el número de activadores de tu entorno.

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, es posible 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