Como solucionar problemas do acionador do Airflow

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

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

Operações de bloqueio no gatilho

Às vezes, as tarefas assíncronas podem ficar bloqueadas nos acionadores. Na maioria dos casos, os problemas vêm de recursos insuficientes de engatilhador ou problemas com o código de 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. Existem duas 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 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. Lembre-se de que, embora os acionadores lidem com tarefas adiáveis, são os workers que são responsáveis por iniciar e, eventualmente, 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 executado pelo Cloud Composer Por padrão, os gatilhos precisam depender da biblioteca asyncio para 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.

Acionadores em excesso

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 do Monitoring (clique para ampliar)

Os gráficos de memória e consumo de CPU indicam que a insuficiência de recursos causa é reiniciada porque a sondagem de atividade falha devido à ausência de sinais de funcionamento:

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

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.

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. Essa fase é controlada pelo Celery Executor e, portanto, a configuração e os limites de recursos correspondentes 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 gatilho

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

Classe de gatilho não encontrada

Como a pasta DAGs não está sincronizada com o acionador do Airflow, o código do acionador inline não está disponível quando o acionador é executado. O erro é gerada 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 o seguinte 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 os gatilhos incompletos permanecem no banco de dados do Airflow. Essa mensagem geralmente significa que o engatilhador foi desativado antes de todos foram 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 permanece nesse estado até atingir o tempo limite. 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 operadores ou tarefas adiados e todas as tarefas adiadas forem concluídas.

A seguir