Resolução de problemas de atualizações do ambiente

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

Esta página fornece informações de resolução de problemas para problemas que pode encontrar ao atualizar ou fazer a atualização dos ambientes do Cloud Composer.

Para ver informações de resolução de problemas relacionadas com a criação de ambientes, consulte o artigo Resolução de problemas de criação de ambientes.

Quando os ambientes do Cloud Composer são atualizados, a maioria dos problemas ocorre pelos seguintes motivos:

  • Problemas de autorização da conta de serviço
  • Problemas de dependência do PyPI
  • Tamanho da base de dados do Airflow

Autorizações insuficientes para atualizar ou fazer uma atualização de um ambiente

Se o Cloud Composer não conseguir atualizar nem fazer uma atualização de um ambiente devido a autorizações insuficientes, apresenta a seguinte mensagem de erro:

ERROR: (gcloud.composer.environments.update) PERMISSION_DENIED: The caller does not have permission

Solução: atribua funções à sua conta e à conta de serviço do seu ambiente, conforme descrito em Controlo de acesso.

A conta de serviço do ambiente tem autorizações insuficientes

Quando cria um ambiente do Cloud Composer, especifica uma conta de serviço que executa a maioria das operações do ambiente. Se esta conta de serviço não tiver autorizações suficientes para a operação pedida, o Cloud Composer gera um erro:

    UPDATE operation on this environment failed 3 minutes ago with the
    following error message:
    Composer Backend timed out. Currently running tasks are [stage:
    CP_COMPOSER_AGENT_RUNNING
    description: "No agent response published."
    response_timestamp {
      seconds: 1618203503
      nanos: 291000000
    }
    ].

Solução: atribua funções à sua Conta Google e à conta de serviço do seu ambiente, conforme descrito em Controlo de acesso.

O tamanho da base de dados do Airflow é demasiado grande para realizar a operação

Uma operação de atualização pode não ser bem-sucedida porque o tamanho da base de dados do Airflow é demasiado grande para que as operações de atualização sejam bem-sucedidas.

Se o tamanho da base de dados do Airflow for superior a 16 GB, o Cloud Composer devolve o seguinte erro:

Airflow database uses more than 16 GB. Please clean the database before upgrading.

Solução: execute a limpeza da base de dados do Airflow, conforme descrito no artigo Limpe a base de dados do Airflow.

Uma atualização para uma nova versão do Cloud Composer falha devido a conflitos de pacotes do PyPI

Quando atualiza um ambiente com pacotes PyPI personalizados instalados, podem ocorrer erros relacionados com conflitos de pacotes PyPI. Isto pode acontecer porque a nova imagem do Cloud Composer contém versões posteriores de pacotes pré-instalados. Isto pode causar conflitos de dependência com pacotes PyPI que instalou no seu ambiente.

Solução:

  • Para obter informações detalhadas sobre conflitos de pacotes, execute uma verificação de atualização.
  • Afrouxe as restrições de versão para pacotes PyPI personalizados instalados. Por exemplo, em vez de especificar uma versão como ==1.0.1, especifique-a como >=1.0.1.
  • Para mais informações sobre como alterar os requisitos de versão para resolver dependências em conflito, consulte a documentação do pip.

Não é possível atualizar um ambiente para uma versão que ainda seja suportada

Os ambientes do Cloud Composer só podem ser atualizados para várias versões mais recentes e anteriores.

As limitações de versão para criar novos ambientes e atualizar os ambientes existentes são diferentes. A versão do Cloud Composer que escolher quando criar um novo ambiente pode não estar disponível quando atualizar ambientes existentes.

Pode realizar a operação de atualização através da CLI Google Cloud, da API ou do Terraform. Na Google Cloud consola, apenas as versões mais recentes estão disponíveis como opções de atualização.

O ambiente não está em bom estado (falha na verificação de atividade)

Só é possível atualizar um ambiente se o respetivo estado for comunicado como em bom estado.

Uma das causas mais comuns para o estado não saudável é quando os componentes do ambiente se aproximam dos limites de recursos configurados e funcionam constantemente com a carga máxima. Uma vez que alguns componentes do ambiente não conseguem comunicar o respetivo estado, o DAG de verificação de atividade comunica o estado do ambiente como não saudável.

Para resolver este problema, recomendamos que aumente os limites de recursos. Embora recomendemos que mantenha o seu ambiente sempre longe dos limites, também pode fazê-lo apenas durante o período em que o seu ambiente é atualizado.

A falta de conetividade ao DNS pode causar problemas ao realizar atualizações

Estes problemas de conetividade podem resultar em entradas de registo como esta:

WARNING - Compute Engine Metadata server unavailable attempt 1 of 5. Reason: [Errno -3] Temporary failure in name resolution Error

Normalmente, significa que não existe um caminho para o DNS. Por isso, certifique-se de que o nome DNS metadata.google.internal pode ser resolvido para o endereço IP a partir das redes de clusters, pods e serviços. Verifique se tem o acesso privado à Google ativado na VPC (no projeto anfitrião ou de serviço) onde o seu ambiente foi criado.

A CPU do acionador excede o limite de 1 vCPU

As versões 2.4.4 e posteriores do Cloud Composer introduzem uma estratégia de atribuição de recursos do acionador diferente para melhorar o escalamento do desempenho. Se encontrar um erro relacionado com a CPU do acionador ao fazer uma atualização do ambiente, significa que os acionadores atuais estão configurados para usar mais de 1 vCPU por acionador.

Solução:

Inspecione os avisos de migração com falhas

Quando atualiza o Airflow para uma versão posterior, por vezes, são aplicadas novas restrições à base de dados do Airflow. Se não for possível aplicar estas restrições, o Airflow cria novas tabelas para armazenar as linhas para as quais não foi possível aplicar as restrições. A IU do Airflow apresenta uma mensagem de aviso até que as tabelas de dados movidas sejam mudadas de nome ou eliminadas.

Solução:

Pode usar os dois DAGs seguintes para inspecionar os dados movidos e mudar o nome das tabelas.

O DAG apresenta as linhas que foram movidas de todas as tabelas onde não foi possível aplicar restrições.list_moved_tables_after_upgrade_dag Inspeccione os dados e decida se quer mantê-los. Para o manter, tem de corrigir manualmente os dados na base de dados do Airflow. Por exemplo, adicionando novamente as linhas com os dados corretos.

Se não precisar dos dados ou se já os tiver corrigido, pode executar o rename_moved_tables_after_upgrade_dag DAG. Este DAG muda o nome das tabelas movidas. As tabelas e os respetivos dados não são eliminados, pelo que pode rever os dados posteriormente.

"""
When upgrading Airflow to a newer version,
it might happen that some data cannot be migrated,
often because of constraint changes in the metadata base.
This file contains 2 DAGs:

1. 'list_moved_tables_after_upgrade_dag'
  Prints the rows which failed to be migrated.
2. 'rename_moved_tables_after_upgrade_dag'
  Renames the table which contains the failed migrations. This will remove the
  warning message from airflow.
"""

import datetime
import logging

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.postgres.hooks.postgres import PostgresHook
from airflow.settings import AIRFLOW_MOVED_TABLE_PREFIX


def get_moved_tables():
    hook = PostgresHook(postgres_conn_id="airflow_db")
    return hook.get_records(
        "SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename"
        f" LIKE '{AIRFLOW_MOVED_TABLE_PREFIX}_%'"
    )


def list_moved_records():
    tables = get_moved_tables()
    if not tables:
        logging.info("No moved tables found")
        return

    hook = PostgresHook(postgres_conn_id="airflow_db")
    for schema, table in tables:
        df = hook.get_pandas_df(f"SELECT * FROM {schema}.{table}")
        logging.info(df.to_markdown())


def rename_moved_tables():
    tables = get_moved_tables()
    if not tables:
        return

    hook = PostgresHook(postgres_conn_id="airflow_db")
    for schema, table in tables:
        hook.run(f"ALTER TABLE {schema}.{table} RENAME TO _abandoned_{table}")


with DAG(
    dag_id="list_moved_tables_after_upgrade_dag",
    start_date=datetime.datetime(2023, 1, 1),
    schedule_interval=None,
    catchup=False,
):
    t1 = PythonOperator(
        task_id="list_moved_records", python_callable=list_moved_records
    )

with DAG(
    dag_id="rename_moved_tables_after_upgrade_dag",
    start_date=datetime.datetime(2023, 1, 1),
    schedule_interval=None,
    catchup=False,
) as dag:
    t1 = PythonOperator(
        task_id="rename_moved_tables", python_callable=rename_moved_tables
    )

A operação do ambiente permanece no estado de falha indefinidamente

Os ambientes do Cloud Composer 2 baseiam-se em tópicos e subscrições do Pub/Sub para comunicar com recursos localizados no projeto de inquilino do seu ambiente durante as operações do ambiente.

Se a API Pub/Sub estiver desativada no seu projeto ou se as subscrições ou os tópicos do ambiente forem eliminados, uma operação do ambiente pode falhar e permanecer no estado de falha indefinidamente. Tal ambiente fica irrevogavelmente danificado.

O que se segue?