Ir para o conteúdo

Como soluciono problemas de tarefas que estão travadas no estado Em fila no meu ambiente do Amazon MWAA?

9 minuto de leitura
0

Estou executando fluxos de trabalho no Amazon Managed Workflows for Apache Airflow (Amazon MWAA), mas minhas tarefas estão travadas no estado Em fila. As tarefas não avançam para o estado Em execução.

Breve descrição

As tarefas no Amazon MWAA podem permanecer travadas no estado Em fila pelos seguintes motivos:

  • O ambiente atingiu o número máximo de tarefas simultâneas.
  • As opções de configuração do Airflow estão definidas incorretamente em seu ambiente MWAA.
  • Não há memória ou CPU suficientes para as tarefas no processamento.

Uma tarefa fica travada no estado Em fila, quando há uma falha no fluxo de trabalho normal de execução de uma tarefa. O processamento do Apache Airflow pode ficar sobrecarregado e não responder em um tempo especificado. Quando isso ocorre, a tarefa permanece na fila do Amazon Simple Queue Service (Amazon SQS) até que o tempo limite de visibilidade padrão seja atingido em 12 horas. Se você configurou novas tentativas, o agendador do Apache Airflow tentará realizar a tarefa novamente.

Resolução

Antes de solucionar problemas, verifique se os recursos do seu ambiente estão atingindo a carga máxima ou se estão enfrentando problemas relacionados ao processamento. Use o Amazon CloudWatch para verificar os logs de processamento do seu ambiente e as métricas CPUUtilization e MemoryUtilization.

Verifique se o ambiente atingiu o número máximo de tarefas simultâneas

Seu ambiente atinge o número máximo de tarefas simultâneas quando o grupo do Amazon MWAA está cheio e o ambiente adiciona mais tarefas à fila. Para resolver esse problema, aumente a contagem do processamento em seu ambiente ou altere o tamanho da classe do ambiente.

Para saber se você deve aumentar a contagem de processamentos em seu ambiente, conclua as seguintes etapas:

  1. Abra o console do CloudWatch.
  2. No painel de navegação, clique em Métricas e, em seguida, selecione Todas as métricas.
  3. Clique na guia Procurar, selecione a região da AWS em que seu ambiente está e, em seguida, pesquise o nome do seu ambiente.
  4. Na seção AWS Namespaces, selecione MWAA < Fila.
  5. Clique em QueuedTasks e RunningTasks.
  6. No gráfico, encontre o período com mais atividade e, em seguida, adicione a contagem total de ambas as métricas.
    Observação: a soma é o número total de tarefas desse período.
  7. Determine o nível padrão de simultaneidade do seu ambiente.
    Observação: por exemplo, o ambiente mw1.small tem cinco tarefas simultâneas para cada processamento.
  8. Divida o número total de tarefas pelo nível padrão de tarefas simultâneas.
  9. Subtraia o número pela Contagem máxima de processamentos que você definiu para seu ambiente.
    Observação: se o resultado for um número positivo, você deve adicionar processamentos para cumprir o número atual de tarefas simultâneas.

Para aumentar a contagem de processamentos em seu ambiente ou alterar o tamanho da classe do ambiente, conclua as seguintes etapas:

  1. Abra o console do Amazon MWAA.
  2. Selecione seu ambiente, clique em Editar e, em seguida, em Avançar.
  3. Na seção Classe do ambiente, realize as seguintes ações:
    Aumente a Contagem máxima de processamentos que você definiu na etapa 9.
    Defina também a Contagem mínima de processamentos como um valor que seu workload exige para períodos de menor atividade.
    Observação: é possível adicionar no máximo 25 processamentos ao seu ambiente. Se você precisar de mais de 25 processamentos, em Classe do ambiente, escolha um tamanho maior.
  4. Se você aumentar o tamanho da classe do ambiente, defina também uma contagem máxima e mínima de processamentos que seu workload exige.

Se você otimizar a contagem de processamentos e ela ainda não for suficiente para seu workload, realize as seguintes ações:

  • Use operadores adiáveis no lugar dos sensores do Apache Airflow. Para obter mais informações, consulte Deferrable operators & triggers (Operadores e gatilhos adiáveis) no site do Apache Airflow.
  • Escalone os horários de início da execução e mantenha pequenos intervalos de tempo entre o schedule_interval de seus Grafos acíclicos direcionados (DAGs). Agende DAGs em blocos.
  • Se você usar um código personalizado que invoca e monitora uma função externa específica, divida a tarefa em duas. Crie uma tarefa para a invocação e a outra como um operador adiável para monitorar a função.

Verifique se as opções de configuração do Airflow estão definidas incorretamente

Para verificar suas opções de configuração do Airflow, conclua as seguintes etapas:

  1. Abra o console do MWAA.
  2. Clique em Ambientes e, em seguida, selecione seu ambiente MWAA.
  3. Na seção Opções de configuração do Airflow, verifique core.parallelism e celery.worker_autoscale.

Se core.parallelism estiver definido, remova qualquer opção core.parallelism definida manualmente para que o Amazon MWAA possa definir a configuração dinamicamente. O Amazon MWAA calcula a configuração dinâmica padrão por (maxWorkers * maxCeleryWorkers) / schedulers * 1.5. Se você usar o ajuste de escala automático e definir manualmente o valor, poderão ocorrer problemas com a subutilização durante a carga máxima.

Compare o valor da sua opção de configuração celery.worker_autoscale com o nível padrão de simultaneidade. Se você não modificou a opção de configuração celery.worker_autoscale, multiplique o nível padrão de simultaneidade pela contagem máxima de processamentos que você definiu para seu ambiente.

Se o valor de celery.worker_autoscale for involuntariamente menor do que o valor padrão, use as CloudWatch Metrics para monitorar o uso de CPU e da memória de seus processamentos. Se os valores dos recursos forem de 20% a 60% durante a carga máxima, aumente o valor de celery.worker_autoscale para um número maior. Use pequenos incrementos para não usar excessivamente os contêineres de processamento.

Se você não definiu o valor de celery.worker_autoscale ou manteve o valor padrão, monitore o uso de CPU e da memória de seus processamentos. Se as métricas do seu ambiente estiverem muito altas, diminua o valor de celery.worker_autoscale. Se o ambiente for de 20% a 60% durante a carga máxima, é possível aumentar o valor máximo.

Verifique se os processamentos estão falhando devido ao uso excessivo

Quando cada processamento do Celery em um contêiner de processamento do MWAA tem uma tarefa e está com carga máxima, os processamentos podem ser usados em excesso e falhar.

Operadores do Celery em um contêiner de processamento do MWAA pesquisam tarefas quando não estão em uso no momento. Dependendo da complexidade das tarefas em execução e do código que as define, os processamentos podem ser usados em excesso e potencialmente falhar. Isso ocorre quando cada processamento do Celery em um contêiner de processamento do MWAA tem uma tarefa e está sob carga máxima.

Para saber se os processamentos estão sendo usados em excesso e falhando, conclua as seguintes etapas:

  1. Abra o console do CloudWatch.
  2. No painel de navegação, clique em Métricas e, em seguida, selecione Todas as métricas.
  3. Clique na guia Procurar, selecione a região da AWS em que seu ambiente se encontra e, em seguida, pesquise o nome do seu ambiente.
  4. Na seção AWS Namespaces, clique em MWAA < Fila e selecione ApproximateAgeOfOldestTask.
  5. Expanda o intervalo de tempo para incluir um período de 4 a 6 semanas.
    Observação: picos de 40.000 segundos ou mais mostram que as tarefas estão travadas na fila do Amazon SQS e que os processamentos estão falhando devido ao uso excessivo. Além disso, o processamento do Celery não consegue gravar a falha no buffer de eventos porque o sistema a encerrou à força.

Também é possível usar o CloudWatch Insights para alertá-lo quando as tarefas estiverem travadas na fila do Amazon SQS.

Para criar o alerta, conclua as seguintes etapas:

  1. Abra o console do CloudWatch.

  2. No painel de navegação, selecione Logs e, depois, clique em Logs Insights.

  3. Especifique um intervalo de tempo de 4 a 6 semanas.

  4. No menu Critérios de seleção, selecione o grupo de logs do agendador para seu ambiente MWAA.

  5. Insira a seguinte consulta na seção de consulta:

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

    Veja a seguir um exemplo de log que o agendador envia quando recebe uma tarefa previamente enfileirada:

    [[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

Reduza os workloads que consomem muita memória ou computação

Observação: veja cuidadosamente a lista a seguir. Nem todos os fatores são aplicáveis a todos os casos de uso. Se precisar de mais assistência, entre em contato com o AWS Support.

Para reduzir os workloads que consomem muita memória ou computação em seu ambiente, realize as seguintes ações:

  • Certifique-se de que seu código DAG não contenha scripts de extração, transformação e carregamento (ETL), instruções de movimentação de dados, pipelines de IA ou ML ou outros workloads que consomem muita memória ou computação.
  • Siga as práticas recomendadas do Apache Airflow ao gravar código DAG. Certifique-se de que o código de nível superior seja minimizado e importe somente o necessário. Para obter mais informações, consulte Best practices (Práticas recomendadas) no site do Apache Airflow.
  • Otimize o código DAG. Analise o consumo de memória de quaisquer sensores, hooks ou operadores personalizados, estendidos ou herdados, para encontrar possíveis áreas problemáticas.

Se seus recursos ainda estiverem sendo usados em excesso, realize as seguintes ações:

  • Reduza celery.worker_autoscale de sua configuração de valor padrão. Diminua o valor de celery.worker_autoscale em alguns dígitos e monitore o ambiente por 24 a 48 horas. Continue diminuindo o valor de celery.worker_autoscale até atingir um nível ideal.
    Observação: quando você diminui o valor de celery.worker_autoscale, o grupo de tarefas gerais é reduzido e faz com que mais itens permaneçam no status Em fila por mais tempo. Para combater isso, você também deve aumentar a contagem mínima de processamentos.
  • Além disso, conclua novamente as etapas na seção Verifique se o ambiente atingiu o número máximo de tarefas simultâneas para reduzir as tarefas simultâneas por processamento.

Informações relacionadas

Ajuste de desempenho para o Apache Airflow no Amazon MWAA

Configuration reference (Referência de configuração) no site do Apache Airflow