Solucionar problemas del activador de Airflow

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

En esta página, se proporcionan información y pasos para solucionar problemas comunes con el activador de Airflow.

Operaciones de bloqueo 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 recursos insuficientes del activador o a problemas con el código del operador asíncrono personalizado.

Los registros del activador muestran los mensajes de advertencia que pueden ayudarte a identificar las causas raíz del rendimiento reducido del activador. Hay dos advertencias importantes que debes tener en cuenta.

  1. Se bloqueó el subproceso asíncrono

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

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

    Solución: Para solucionar este problema, asigna más recursos a los activadores, reduce la cantidad de tareas diferidas que se ejecutan al mismo tiempo o aumenta la cantidad de activadores en tu entorno. Ten en cuenta que, si bien los activadores controlan las tareas aplazables, los trabajadores son los responsables de iniciar y, finalmente, completar cada tarea. Si ajustas la cantidad de activadores, considera también escalar la cantidad de instancias de trabajadores.

  2. Una tarea específica bloqueó el subproceso 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 apunta a un fragmento específico de código del operador que ejecuta Cloud Composer. Los activadores, por diseño, deben depender de la biblioteca asyncio para ejecutar operaciones en segundo plano. Una implementación personalizada de un activador puede no cumplir correctamente con los contratos de asyncio (por ejemplo, debido al uso incorrecto de las palabras clave await y async en el código de Python).

    Solución: Inspecciona el código que se indica en la advertencia y verifica si la operación asíncrona se implementó correctamente.

Demasiados activadores

La cantidad de tareas diferidas se puede ver en la métrica task_count, que también se muestra en el panel de Monitoring de tu entorno. Cada activador crea algunos recursos, como conexiones a recursos externos, que consumen memoria.

Tareas diferidas que se muestran en el panel de Monitoring
Figura 1. Tareas diferidas que se muestran en el panel de Monitoring (haz clic para ampliar)

Los gráficos del consumo de memoria y CPU indican que los recursos insuficientes provocan reinicios porque la sonda de actividad falla debido a la falta de latidos:

El activador se reinicia debido a que no hay recursos suficientes
Figura 2. El activador se reinicia debido a recursos insuficientes (haz clic para ampliar)

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

Falla de un trabajador de Airflow durante la ejecución de la devolución de llamada

Una vez que el activador finaliza la ejecución, el control regresa a un trabajador de Airflow, que ejecuta un método de devolución de llamada con una ranura de ejecución. El ejecutor de Celery 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 devolución de llamada falla en el trabajador de Airflow, el trabajador falla o se reinicia el trabajador que ejecuta el método, 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 activación personalizado de tal manera que bloquee por completo el bucle principal del activador, de modo que solo se ejecute el activador dañado en ese momento. En este caso, se genera una advertencia en los registros del activador después de que finaliza el activador problemático.

No se encontró la clase de activación

Dado que la carpeta de DAG no está sincronizada con el activador de Airflow, falta el código de activación intercalado 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: Importa el código faltante desde PyPI.

Mensaje de advertencia sobre el activador en la IU de Airflow

En algunos casos, después de inhabilitar el activador, es posible que veas el siguiente mensaje de advertencia en la IU 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. Por lo general, este mensaje significa que el activador se inhabilitó antes de que se completaran todos los activadores en tu entorno.

Puedes ver todos los activadores que se ejecutan en el entorno en la página Browse > Triggers en la IU de Airflow (se requiere el rol de Admin).

Soluciones:

Las tareas permanecen en el estado diferido después de que se inhabilita el activador

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

Utiliza una de las siguientes soluciones:

  • Marcar manualmente las tareas como con errores
  • 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 si todas las tareas diferidas se completaron.

¿Qué sigue?