es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El flujo de aire deja de programar tareas después de unos días de ejecución.

Versión de Airflow 2.0.2

Tengo tres programadores ejecutándose en un clúster de Kubernetes con el executor CeleryExecutor y una base de datos postgres. Todo parece funcionar correctamente durante un par de semanas, pero luego el programador de Airflow deja de programar algunas tareas. He realizado un “airflow db reset” seguido de un “airflow db init” y un nuevo despliegue de las imágenes específicas de Airflow. A continuación se muestran algunos de los errores que he recibido en el registro de la base de datos:

Según https://github.com/apache/airflow/issues/19811, el problema de “slot_pool” es un comportamiento esperado, pero no logro entender por qué los DAGs de repente dejan de programarse a tiempo. Para referencia, se ejecutan aproximadamente 500 DAGs cada 15 minutos.

LOG: no se pudo recibir datos del cliente: tiempo de conexión agotado

STATEMENT: SELECT slot_pool.pool AS slot_pool_pool, slot_pool.slots AS slot_pool_slots
FROM slot_pool FOR UPDATE NOWAIT

La tabla “slot_pool” luce así:

select * from slot_pool;
 id |     pool     | slots | description
----+--------------+-------+--------------
  1 | default_pool |   128 | Default pool
(1 row)

He revisado varios posts, pero ninguno parece explicar el problema o proporcionar una solución. A continuación se muestran algunos de ellos:

https://stackoverflow.com/questions/58991074/airflow-initdb-slot-pool-does-not-exists

https://stackoverflow.com/questions/69443489/running-multiple-airflow-schedulers-cause-postgres-locking-issues

https://stackoverflow.com/questions/45853013/airflow-tasks-get-stuck-at-queued-status-and-never-gets-running

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con los bloqueos en la base de datos de Postgres, específicamente con la tabla slot_pool. El mensaje LOG indica un tiempo de espera de conexión, lo cual podría dar lugar a una condición de carrera donde varios programadores intentan acceder y bloquear la misma tabla al mismo tiempo, lo que resulta en que uno de los programadores no pueda adquirir un bloqueo.

    Una posible solución para este problema podría ser aumentar el número de slots disponibles en la tabla slot_pool, lo cual podría ayudar a mitigar el problema del bloqueo. Además, también podría ser útil investigar si hay otras tablas en la base de datos que también podrían estar causando problemas de bloqueo.

    Otra solución potencial podría ser utilizar una cola de tareas distribuida como RabbitMQ o Redis en lugar de Celery, o utilizar una base de datos separada para cada programador que se pueda particionar horizontal o verticalmente para ayudar a evitar problemas de bloqueo.

    Por último, también podría ser valioso investigar si hay algún problema con el entorno de Kubernetes, como limitaciones de recursos o problemas de conectividad de red, que podrían estar contribuyendo a los errores de programación.

Comments are closed.