Resolução de problemas do acionador do Airflow

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

Esta página fornece passos de resolução de problemas e informações para problemas comuns com o acionador do Airflow.

Operações de bloqueio no acionador

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

Os registos de acionadores apresentam mensagens de aviso que podem ajudar a identificar as causas essenciais da diminuição do desempenho dos acionadores. Existem dois avisos importantes a ter em atenção.

  1. Discussão assíncrona bloqueada

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

    Este aviso indica problemas de desempenho devido a um volume elevado de tarefas assíncronas.

    Solução: para resolver este problema, atribua mais recursos aos acionadores, reduza o número de tarefas adiadas que são executadas ao mesmo tempo ou aumente o número de acionadores no seu ambiente. Tenha em atenção que, embora os acionadores processem tarefas adiáveis, os trabalhadores são responsáveis por iniciar e, eventualmente, concluir cada tarefa. Se estiver a ajustar o número de acionadores, considere também dimensionar o número de instâncias de trabalho.

  2. Uma tarefa específica bloqueou a discussã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
    

    Este aviso aponta para um fragmento específico de código do operador executado pelo Cloud Composer. Por definição, os acionadores devem basear-se na biblioteca asyncio para executar operações em segundo plano. Uma implementação personalizada de um acionador pode não cumprir corretamente os contratos asyncio (por exemplo, devido à utilização incorreta das palavras-chave await e async no código Python).

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

Demasiados acionadores

O número de tarefas adiadas é visível na métrica task_count, que também é apresentada no painel de controlo de monitorização do seu ambiente. Cada acionador cria alguns recursos, como ligações a recursos externos, que consomem memória.

Tarefas adiadas apresentadas no painel de controlo de monitorização
Figura 1. Tarefas adiadas apresentadas no painel de controlo de monitorização (clique para aumentar)

Os gráficos de consumo de memória e CPU indicam que os recursos insuficientes causam reinícios porque a sondagem de atividade falha devido à falta de sinais de pulsação:

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

Solução: para resolver este problema, atribua mais recursos aos acionadores, reduza o número de tarefas adiadas que são executadas ao mesmo tempo ou aumente o número de acionadores no seu ambiente.

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

Depois de o acionador terminar a execução, o controlo regressa a um worker do Airflow, que executa um método de retorno de chamada através de um espaço de execução. Esta fase é controlada pelo Celery Executor e, por isso, aplicam-se os limites de configuração e de recursos correspondentes (como parallelism ou worker_concurrency).

Se o método de retorno de chamada falhar no worker do Airflow, o worker falha ou o worker que executa o método é reiniciado, a tarefa é marcada como FAILED. Neste caso, a operação de nova tentativa volta a executar toda a tarefa e não apenas o método de retorno de chamada.

Repetição infinita num acionador

É possível implementar um operador de acionador personalizado de forma a bloquear completamente o ciclo do acionador principal, para que apenas o acionador danificado seja executado no momento. Neste caso, é gerado um aviso nos registos do acionador após a conclusão do acionador problemático.

Classe de acionador não encontrada

Uma vez que a pasta DAGs não está sincronizada com o acionador do Airflow, o código do acionador incorporado está em falta quando o acionador é executado. O erro é gerado nos registos da tarefa com falha:

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

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

Mensagem de aviso sobre o acionador na IU do Airflow

Em alguns casos, depois de o acionador ser desativado, 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 apresentar esta mensagem porque permanecem acionadores incompletos na base de dados do Airflow. Normalmente, esta mensagem significa que o acionador foi desativado antes de todos os acionadores serem concluídos no seu ambiente.

Pode ver todos os acionadores que estão a ser executados no ambiente verificando a página Procurar > Acionadores na IU do Airflow (a função Admin é obrigatória).

Soluções:

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

Quando o acionador está desativado, as tarefas que já se encontram no estado diferido permanecem neste estado até o limite de tempo ser atingido. Este limite de tempo pode ser infinito, dependendo da configuração do Airflow e do DAG.

Use uma das seguintes soluções:

  • Marcar manualmente as tarefas como falhadas.
  • Permitir que o acionador conclua as tarefas.

Recomendamos que desative o acionador apenas se o seu ambiente não executar nenhum operador ou tarefa adiada e todas as tarefas adiadas estiverem concluídas.

O que se segue?