Saltar al contenido

¿Cómo soluciono las tareas que están bloqueadas en el estado En cola en mi entorno de Amazon MWAA?

9 minutos de lectura
0

Estoy ejecutando flujos de trabajo en Amazon Managed Workflows para Apache Airflow (Amazon MWAA), pero mis tareas están bloqueadas en el estado En cola. Las tareas no pasan al estado En ejecución.

Descripción corta

Las tareas de Amazon MWAA pueden permanecer bloqueadas en el estado En cola por los siguientes motivos:

  • El entorno alcanzó el número máximo de tareas simultáneas.
  • Las opciones de configuración de Airflow están configuradas incorrectamente en tu entorno de MWAA.
  • No hay suficiente memoria o CPU para las tareas del trabajador.

Una tarea se bloquea en estado En cola cuando se interrumpe el flujo de trabajo normal de ejecución de una tarea. El trabajador de Apache Airflow puede sentirse abrumado y no responder en un tiempo específico. Cuando esto ocurre, la tarea permanece en la cola de Amazon Simple Queue Service (Amazon SQS) hasta que se alcance el tiempo de espera de visibilidad predeterminado en 12 horas. Si has configurado los reintentos, el programador de Apache Airflow reintentará la tarea.

Resolución

Antes de solucionar problemas, determina si los recursos de tu entorno están alcanzando la carga máxima o si tienen problemas relacionados con los trabajadores. Utiliza Amazon CloudWatch para comprobar los registros de trabajo de tu entorno y las métricas CPUUtilization y MemoryUtilization.

Comprobación para ver si el entorno ha alcanzado el número máximo de tareas simultáneas

Tu entorno alcanza el número máximo de tareas simultáneas cuando el grupo de Amazon MWAA está lleno y el entorno agrega más tareas a la cola. Para resolver este problema, aumenta el número de trabajadores de tu entorno o cambia el tamaño de la clase de entorno.

Para determinar si debes aumentar el número de trabajadores en tu entorno, sigue estos pasos:

  1. Abre la consola de CloudWatch.
  2. En el panel de navegación, elige Métricas y, a continuación, Todas las métricas.
  3. Elige la pestaña Examinar, selecciona la región de AWS en la que se encuentra tu entorno y, a continuación, busca el nombre de tu entorno.
  4. En la sección Espacios de nombres de AWS, elige MWAA < Cola.
  5. Selecciona QueuedTasks y RunningTasks.
  6. En el gráfico, busca el período de tiempo con más actividad y, a continuación, suma el recuento total de ambas métricas.
    Nota: La suma es el número total de tareas para este periodo de tiempo.
  7. Determina el nivel de simultaneidad predeterminado de tu entorno.
    Nota: Por ejemplo, el entorno mw1.small tiene cinco tareas simultáneas para cada trabajador.
  8. Divide el número total de tareas por el nivel predeterminado de tareas simultáneas.
  9. Resta el número por el recuento máximo de trabajadores que hayas establecido para tu entorno.
    Nota: Si el resultado es un número positivo, debes agregar trabajadores para cumplir con el número actual de tareas simultáneas.

Para aumentar el número de trabajadores de tu entorno o cambiar el tamaño de la clase de entorno, sigue estos pasos:

  1. Abre la consola de Amazon MWAA.
  2. Selecciona tu entorno, elige Editar y, a continuación, elige Siguiente.
  3. En la sección Clase de entorno, realiza las siguientes acciones:
    Aumenta el recuento máximo de trabajadores que determinaste en el paso 9.
    Establece también el recuento mínimo de trabajadores en un valor que tu carga de trabajo requiera para los periodos de menor actividad.
    Nota: Solo puedes agregar un máximo de 25 trabajadores para tu entorno. Si necesitas más de 25 trabajadores, en la clase de entorno, elige un tamaño más grande.
  4. Si aumentas el tamaño de la clase de entorno, establece también un recuento máximo y mínimo de trabajadores que requiere tu carga de trabajo.

Si optimizas el recuento de trabajadores y aún no es suficiente para tu carga de trabajo, toma las siguientes medidas:

  • Utiliza operadores diferibles en lugar de los sensores de Apache Airflow. Para obtener más información, consulta Operadores y activadores diferibles en el sitio web de Apache Airflow.
  • Alterna las horas de inicio de la ejecución y mantén pequeños intervalos de tiempo entre el schedule_interval de tus gráficos acíclicos dirigidos (DAG). Programa los DAG en bloques.
  • Si usas código personalizado que invoca y supervisa una función externa específica, divide la tarea en dos tareas. Crea una tarea para la invocación y la otra como un operador diferible para supervisar la función.

Comprobación para ver si las opciones de configuración del flujo de aire están configuradas incorrectamente

Para comprobar las opciones de configuración de Airflow, sigue estos pasos:

  1. Abre la consola de MWAA.
  2. Elige Entornos y, a continuación, selecciona tu entorno de MWAA.
  3. En la sección Opciones de configuración de Airflow, comprueba core.parallelism y celery.worker_autoscale.

Si has establecido core.parallelism, elimina cualquier opción core.parallelism establecida manualmente para que Amazon MWAA pueda establecer la configuración de forma dinámica. Amazon MWAA calcula la configuración dinámica predeterminada mediante (maxWorkers * maxCeleryWorkers) / schedulers * 1.5. Si utilizas el escalamiento automático y estableces el valor manualmente, pueden producirse problemas de infrautilización durante la carga máxima.

Compara el valor de la opción de configuración celery.worker_autoscale con el nivel de simultaneidad predeterminado. Si no has modificado la opción de configuración celery.worker_autoscale, multiplica el nivel predeterminado de simultaneidad por el número máximo de trabajadores que has establecido para tu entorno.

Si el valor de celery.worker_autoscale es involuntariamente inferior al valor predeterminado, utiliza las métricas de CloudWatch para supervisar el uso de la CPU y la memoria de los trabajadores. Si los valores de los recursos son del 20 al 60 % durante la carga máxima, aumenta el valor de celery.worker_autoscale a un número mayor. Usa incrementos pequeños para no abusar de los contenedores de trabajadores.

Si no has configurado el valor de celery.worker_autoscale o has mantenido el valor predeterminado, supervisa el uso de la CPU y la memoria de los trabajadores. Si las métricas de tu entorno son demasiado altas, reduce el valor de celery.worker_autoscale. Si el entorno es del 20 al 60 % durante la carga máxima, puedes aumentar el valor máximo.

Comprobación para ver si los trabajadores devuelven un error debido al uso excesivo

Cuando todos los trabajadores de Celery de un contenedor de trabajadores de MWAA tienen una tarea y tienen una carga máxima, es posible que los trabajadores sufran un uso excesivo y fallen.

Los trabajadores de Celery que están en un contenedor de trabajador MWAA buscan tareas cuando no se utilizan actualmente. En función de la complejidad de las tareas en ejecución y del código que las defina, los trabajadores pueden utilizarse en exceso y es posible que se bloqueen. Esto ocurre cuando todos los trabajadores de Celery de un contenedor de trabajadores de MWAA tienen una tarea y están bajo la carga máxima.

Para determinar si los trabajadores se usan en exceso y devuelven errores, sigue estos pasos:

  1. Abre la consola de CloudWatch.
  2. En el panel de navegación, elige Métricas y, a continuación, Todas las métricas.
  3. Elige la pestaña Examinar, selecciona la región de AWS en la que se encuentra tu entorno y, a continuación, busca el nombre de tu entorno.
  4. En la sección Espacios de nombres de AWS, elige MWAA < Cola y, a continuación, selecciona ApproximateAgeOfOldestTask.
  5. Amplía el intervalo de tiempo para incluir un periodo de 4 a 6 semanas.
    Nota: Los picos de 40 000 segundos o más muestran que las tareas están bloqueadas en la cola de Amazon SQS y que los trabajadores están fallando debido a un uso excesivo. Además, el trabajador de Celery no puede escribir el error en el búfer de eventos porque el sistema lo cerró forzosamente.

También puedes usar Información de CloudWatch para recibir alertas cuando las tareas se quedan bloqueadas en la cola de Amazon SQS.

Para crear la alerta, sigue estos pasos:

  1. Abre la consola de CloudWatch.

  2. En el panel de navegación, elige Registros y, a continuación, selecciona Información de registros.

  3. Especifica un intervalo de tiempo de 4 a 6 semanas.

  4. En el menú Criterios de selección, selecciona el grupo de registro del planificador para tu entorno de MWAA.

  5. Introduce la siguiente consulta en la sección de consultas:

    fields _@timestamp_, _@message_, _@logStream_, _@log_  
    | filter _@message_ like /Was the task terminated externally?/  
    | sort _@timestamp_ desc  
    | limit 10000

    A continuación se muestra un ejemplo de registro que el programador envía cuando recibe una tarea previamente puesta en cola:

    [[34m**2024-01-17T11:30:18.936+0000**[0m] [34mscheduler_job_runner.py:[0m771 ERROR[0m - Executor reports task instance <TaskInstance: dag_name.task_name manual__202X-XX-XXTXX:XX:XX.758774+00:00 [queued]> finished (failed) although the task says it's queued. (Info: None) Was the task terminated externally?[0m

Reducción de las cargas de trabajo con uso intensivo de memoria o procesamiento

Nota: Considera detenidamente la siguiente lista. No todos los factores son aplicables a todos los casos de uso. Si necesitas más ayuda, ponte en contacto con AWS Support.

Para reducir las cargas de trabajo con uso intensivo de memoria o procesamiento en tu entorno, toma las siguientes medidas:

  • Asegúrate de que tu código DAG no contenga scripts de extracción, transformación y carga (ETL), instrucciones de movimiento de datos, canalizaciones de IA o machine learning u otras cargas de trabajo con uso intensivo de memoria o procesamiento.
  • Sigue las prácticas recomendadas de Apache Airflow al escribir código DAG. Asegúrate de que el código de nivel superior esté minimizado e importe solo lo que sea necesario. Para obtener más información, consulta Prácticas recomendadas en el sitio web de Apache Airflow.
  • Optimiza el código DAG. Crea un perfil del consumo de memoria de los sensores, enlaces u operadores personalizados, extendidos o heredados para encontrar posibles áreas problemáticas.

Si tus recursos siguen utilizándose en exceso, toma las siguientes medidas:

  • Reduce celery.worker_autoscale de su configuración de valores predeterminados. Reduce el valor de celery.worker_autoscale en un par de dígitos y, a continuación, supervisa el entorno durante 24 a 48 horas. Sigue reduciendo el valor de celery.worker_autoscale hasta que alcances un nivel óptimo.
    Nota: Al reducir el valor de celery.worker_autoscale, el grupo de tareas general se reduce y hace que más elementos permanezcan en el estado En cola durante más tiempo. Para contrarrestar esto, también debes aumentar el número mínimo de trabajadores.
  • Además, debes completar de nuevo los pasos de la sección Comprobar si el entorno ha alcanzado el número máximo de tareas simultáneas para reducir las tareas simultáneas por trabajador.

Información relacionada

Ajuste del rendimiento para Apache Airflow en Amazon MWAA

Referencia de configuración en el sitio web de Apache Airflow