Como solucionar problemas do acionador do Airflow

Cloud Composer 1 | Cloud Composer 2

Nesta página, você encontra as etapas para 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 ser bloqueadas nos gatilhos. Na maioria dos casos, os problemas vêm de recursos insuficientes do engatilhador ou problemas com o código personalizado do operador assíncrono.

Os registros do acionador mostram mensagens de aviso que podem ajudar a identificar as causas raiz da queda no desempenho do acionador. Há dois avisos significativos a serem observados.

  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 grande volume de tarefas assíncronas.

    Solução: para resolver esse problema, aloque mais recursos para os engatilhadores, reduza o número de tarefas adiadas executadas ao mesmo tempo ou aumente o número de acionadores no ambiente. Embora os gatilhos processem tarefas adiáveis, são os workers responsáveis por iniciar e, por fim, 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 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 de operador executada pelo Cloud Composer. Por padrão, os gatilhos 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.

Excesso de acionadores

O número de tarefas adiadas fica visível na métrica task_count, que também é exibida no painel do Monitoring do ambiente. Cada gatilho 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 do Monitoring (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 aos batimentos cardíacos ausentes:

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

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

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

Depois que o gatilho conclui 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 Celery Executor e, portanto, a configuração correspondente e os limites de recursos se aplicam (como parallelism ou worker_concurrency).

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

Loop infinito em um gatilho

É possível implementar um operador de gatilho personalizado de modo que ele bloqueie totalmente o loop do acionador principal, de modo que apenas o gatilho corrompido seja executado no momento. Nesse caso, um aviso é gerado nos registros do acionador depois que o acionador problemático é concluído.

Classe do gatilho não encontrada

Como a pasta de DAGs não está sincronizada com o acionador do Airflow, o código do gatilho inline está ausente quando o gatilho é 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 gatilho na interface do Airflow

Em alguns casos, depois que o acionador é desativado, você pode ver a seguinte mensagem de aviso na IU 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 gatilhos incompletos permanecem no banco de dados do Airflow. Essa mensagem geralmente significa que o acionador foi desativado antes da conclusão de todos acionadores no ambiente.

Para visualizar todos os gatilhos em execução no ambiente, consulte a página Procurar > Acionadores na IU do Airflow. O papel Admin é obrigatório.

Soluções:

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

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:

  • Marcar manualmente as tarefas como falhas.
  • Ative o acionador para concluir as tarefas.

Recomendamos desativar o acionador somente se o ambiente não executar nenhum operador ou tarefa adiado e se todas as tarefas adiadas estiverem concluídas.

A seguir