Como solucionar problemas do acionador do Airflow

Airflow gerenciado (Geração 3) | Airflow gerenciado (Geração 2) | Airflow gerenciado (Geração 1 legada)

Esta página fornece etapas de solução de problemas e informações sobre problemas comuns com o acionador do Airflow.

Operações de bloqueio no acionador

As tarefas assíncronas podem ser bloqueadas ocasionalmente nos acionadores. Na maioria dos casos, os problemas vêm de recursos insuficientes do acionador ou de problemas com o código do operador assíncrono personalizado.

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

  1. Thread 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 desempenho devido a um grande volume de tarefas assíncronas.

    Solução: para resolver esse problema:

    • Ajuste os parâmetros do engatilhador para alocar mais recursos aos engatilhadores ou aumentar o número de engatilhadores no ambiente.
    • Reduza o número de tarefas adiadas que são executadas ao mesmo tempo.

    Embora os acionadores processem tarefas adiáveis, os workers do Airflow são responsáveis por iniciar e concluir cada tarefa. Se você estiver ajustando o número de acionadores, considere também dimensionar o número de instâncias de worker.

  2. Uma tarefa específica bloqueou a thread assíncrona:

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

    Esse aviso aponta para um trecho específico de código do operador executado pelo Serviço Gerenciado para Apache Airflow. Os acionadores dependem 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 está implementada corretamente.

Muitos acionadores

O número de tarefas adiadas é visível na métrica task_count, que é também mostrada no painel do Monitoring do ambiente. Cada acionador cria alguns recursos, como conexões a recursos externos, que consomem memória.

Tarefas adiadas mostradas no painel do Monitoring
Figura 1. Tarefas adiadas mostradas no painel do Monitoring dashboard (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 sinais de funcionamento:

O engatilhador é reiniciado devido a recursos insuficientes
Figura 1. Reinicializações do acionador devido a recursos insuficientes (clique para ampliar)

Solução: para resolver esse problema:

  • Ajuste os parâmetros do engatilhador para alocar mais recursos aos engatilhadores ou aumentar o número de engatilhadores no ambiente.
  • Reduza o número de tarefas adiadas que são executadas ao mesmo tempo.

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

Depois que o acionador termina a execução, o controle retorna a um worker do Airflow, que executa um método de callback usando um slot de execução. Essa fase é controlada pelo executor do Celery e, portanto, os limites de configuração e recursos correspondentes são aplicados (como parallelism ou worker_concurrency).

Se o método de callback falhar no worker do Airflow, o worker falhará ou o worker que executa o método será reiniciado. A tarefa será marcada como FAILED. Nesse caso, a operação de repetição reexecuta toda a tarefa, não apenas o método de callback.

Loop infinito em um acionador

É possível implementar um operador de acionador personalizado de forma que ele bloqueie totalmente o loop do acionador principal, para que apenas o acionador quebrado seja executado no momento. Nesse caso, um aviso é gerado nos registros do acionador após a conclusão do acionador problemático.

Classe de acionador não encontrada

Como a pasta DAGs não está sincronizada com o acionador do Airflow, 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, você pode ver a seguinte mensagem de aviso 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 essa mensagem porque acionadores incompletos permanecem no banco de dados do Airflow. Essa mensagem geralmente significa que o acionador foi desativado antes que todos os acionadores fossem concluídos no ambiente.

Para conferir todos os acionadores em execução no ambiente, acesse a página Navegar > Acionadores na interface do Airflow. A função Admin é necessária.

Soluções:

As tarefas permanecem no estado adiado após a desativação do acionador

Quando o acionador é 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 manualmente como com falha.
  • Ative o acionador para concluir as tarefas.

Recomendamos desativar o acionador somente se o ambiente não executar operadores ou tarefas adiadas e todas as tarefas adiadas forem concluídas.

A seguir