Como solucionar problemas do acionador do Airflow

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

Nesta página, você encontra etapas de solução de problemas e informações sobre problemas comuns com o acionador do Airflow.

Operações de bloqueio no acionador

Tarefas assíncronas podem, ocasionalmente, ser bloqueadas em acionadores. Na maioria dos casos, os problemas são causados por recursos de acionador insuficientes ou problemas com o código do operador assíncrono personalizado.

Os registros do acionador mostram todas as mensagens de aviso que podem ajudar a identificar as causas raiz da diminuição do desempenho do acionador. Há dois alertas importantes a serem procurados.

  1. Linha de execução assíncrona bloqueada

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

    Esse aviso sinaliza problemas de performance devido a um alto volume de tarefas assíncronas.

    Solução: para resolver esse problema, aloque mais recursos para os acionadores, reduzindo o número de tarefas adiadas que são executadas ao mesmo tempo ou aumentando o número de acionadores no seu ambiente. Embora os acionadores processem tarefas adiáveis, é os workers responsáveis por iniciar e, para concluir cada tarefa. Se você estiver ajustando o número de acionadores, considere também escalonar o número de instâncias de worker.

  2. Uma tarefa específica bloqueou a linha de execução assíncrona.

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done, defined at /opt/***/***/jobs/my-custom-code.py:609> result=None> took 0.401 second
    

    Esse aviso aponta para uma parte específica do código do operador executada pelo Cloud Composer. Os acionadores por design precisam depender da biblioteca asyncio para executar operações em segundo plano. Uma implementação personalizada de um acionador pode não aderir corretamente aos contratos asyncio (por exemplo, devido ao uso incorreto das palavras-chave await e async no código Python).

    Solução: inspecione o código informado pelo aviso e verifique se a operação assíncrona foi implementada corretamente.

Muitos acionadores

O número de tarefas adiadas aparece na métrica task_count, que também é exibida no painel de monitoramento do seu ambiente. Cada acionador cria alguns recursos, como conexões com recursos externos, que consomem memória.

Tarefas adiadas exibidas no painel do Monitoring
Figura 1. Tarefas adiadas exibidas no painel de monitoramento (clique para ampliar)

Os gráficos de consumo de memória e CPU indicam que recursos insuficientes causam reinicializações porque a sondagem de atividade falha devido à falta de batimentos cardíacos:

O gatilho é reiniciado devido a recursos insuficientes
Figura 2. O gatilho é reiniciado devido a recursos insuficientes (clique para ampliar)

Solução: para resolver esse problema, aloque mais recursos aos acionadores, reduzindo o número de tarefas adiadas executadas ao mesmo tempo ou aumentando o número de acionadores no ambiente.

Falha de um worker do Airflow durante a execução do callback

Depois que o gatilho termina a execução, o controle retorna para uma janela do Airflow worker, que executa um método de callback usando um slot de execução. Esta fase é controlado pelo Celery Executor. Portanto, a configuração e o os limites de recursos são aplicados (como parallelism ou worker_concurrency).

Se o método de callback falhar no worker do Airflow, o worker também vai falhar O worker que executa o método é reiniciado, e a tarefa é marcada como FAILED. Em nesse caso, a operação de repetição vai executar novamente a tarefa inteira, não apenas método de callback.

Loop infinito em um acionador

É possível implementar um operador de gatilho personalizado de modo a bloqueia totalmente o loop do engatilhador principal, de modo que apenas o gatilho corrompido seja executados naquele momento. Nesse caso, um aviso é gerado nos registros do acionador após a conclusão do acionador problemático.

Classe de gatilho não encontrada

Como a pasta de DAGs não está sincronizada com o acionador do Airflow, o O código do acionador embutido está ausente quando o acionador é executado. O erro é gerado nos registros da tarefa com falha:

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

Solução: importe o código ausente do PyPI.

Mensagem de aviso sobre o acionador na interface do Airflow

Em alguns casos, depois que o acionador é desativado, a seguinte mensagem de aviso aparece na interface do 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.

O Airflow pode mostrar esta mensagem porque gatilhos incompletos permanecem no Airflow no seu banco de dados. Essa mensagem geralmente significa que o acionador foi desativado antes que todos os acionadores fossem concluídos no seu ambiente.

Para conferir todos os gatilhos em execução no ambiente, acesse a página Procurar > Gatilhos na interface do Airflow. O papel Admin é necessário.

Soluções:

As tarefas permanecem no estado adiado depois que o acionador é desativado

Quando o acionador está desativado, as tarefas que já estão no estado adiado permanecem nesse estado até que o tempo limite seja atingido. Esse tempo limite pode ser infinito, dependendo da configuração do Airflow e do DAG.

Use uma das seguintes soluções:

  • Marque as tarefas como reprovadas manualmente.
  • Ative o acionador para concluir as tarefas.

Recomendamos desativar o acionador apenas se o ambiente não executar nenhum operadores ou tarefas adiadas, e todas as tarefas adiadas são concluídas.

A seguir