Soluciona problemas de actualizaciones y mejoras de entornos

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

En esta página, se proporciona información para solucionar problemas relacionados con problemas que puedes encontrar cuando actualizas entornos de Cloud Composer.

Para obtener información sobre la solución de problemas relacionados con la creación de entornos, consulta Solución de problemas de creación de entornos.

Cuando se actualizan los entornos de Cloud Composer, la mayoría de los problemas ocurren debido a los siguientes motivos:

  • Problemas de permisos de la cuenta de servicio
  • Problemas de dependencia de PyPI
  • Tamaño de la base de datos de Airflow

No tienes permisos suficientes para actualizar un entorno

Si Cloud Composer no puede actualizar un entorno debido a permisos insuficientes, se mostrará el siguiente mensaje de error:

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

Solución: Asigna roles a tu cuenta y a la cuenta de servicio de tu entorno como se describe en Control de acceso.

La cuenta de servicio del entorno no tiene permisos suficientes.

Cuando creas un entorno de Cloud Composer, especificas una cuenta de servicio que realiza la mayoría de las operaciones del entorno. Si esta cuenta de servicio no tiene suficientes permisos para la operación solicitada, Cloud Composer genera un error:

    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
    }
    ].

Solución: Asigna roles a tu Cuenta de Google y a la cuenta de servicio de tu entorno como se describe en Control de acceso.

El tamaño de la base de datos de Airflow es demasiado grande para realizar la operación.

Es posible que una operación de actualización no se realice de forma correcta porque el tamaño de la base de datos de Airflow es demasiado grande para que las operaciones de actualización se realicen con éxito.

Si el tamaño de la base de datos de Airflow supera los 16 GB, Cloud Composer genera el siguiente error:

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

Solución: Realiza la limpieza de la base de datos de Airflow, como se describe en Limpiar la base de datos de Airflow.

Una actualización a una versión nueva de Cloud Composer falla debido a conflictos de paquetes de PyPI.

Cuando actualizas un entorno con paquetes PyPI personalizados instalados, es posible que encuentres errores relacionados con conflictos de paquetes de PyPI. Esto puede suceder porque la imagen nueva de Cloud Composer contiene versiones más recientes de paquetes preinstalados. Esto puede causar conflictos de dependencias con los paquetes de PyPI que instalaste en tu entorno.

Solución:

  • Para obtener información detallada sobre los conflictos de paquetes, ejecuta una verificación de actualización.
  • Disminuye las restricciones de versiones para los paquetes personalizados de PyPI instalados. Por ejemplo, en lugar de especificar una versión como ==1.0.1, especifícala como >=1.0.1.
  • Para obtener más información sobre cómo cambiar los requisitos de versión para resolver dependencias en conflicto, consulta la documentación de pip.

No es posible actualizar un entorno a una versión que aún se admite.

Los entornos de Cloud Composer solo se pueden actualizar a varias versiones anteriores y más recientes.

Las limitaciones de versión para crear entornos nuevos y actualizar los existentes son diferentes. Es posible que la versión de Cloud Composer que elijas cuando crees un entorno nuevo no esté disponible cuando actualices entornos existentes.

Puedes realizar la operación de actualización con Google Cloud CLI, la API o Terraform. En la consola de Google Cloud , solo las versiones más recientes están disponibles como opciones de actualización.

El entorno no está en buen estado (falló la verificación de actividad)

Solo es posible actualizar un entorno si su estado se informa como en buen estado.

Una de las causas más comunes del estado no saludable es cuando los componentes del entorno se acercan a los límites de recursos configurados y operan constantemente con la carga máxima. Dado que algunos componentes del entorno no pueden informar su estado, el DAG de verificación de actividad informa que el estado del entorno no es correcto.

Para resolver este problema, te recomendamos que aumentes los límites de recursos. Aunque te recomendamos que evites que tu entorno se acerque a los límites en todo momento, también puedes hacerlo solo durante el período en que se actualiza tu entorno.

La falta de conectividad con el DNS puede causar problemas durante las actualizaciones

Estos problemas de conectividad pueden generar entradas de registro como las siguientes:

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

Por lo general, significa que no hay una ruta al DNS, por lo que debes asegurarte de que el nombre de DNS metadata.google.internal se pueda resolver en la dirección IP desde las redes de clústeres, Pods y servicios. Verifica si tienes activado el Acceso privado a Google en la VPC (en el proyecto host o de servicio) en la que se creó tu entorno.

La CPU del activador supera el límite de 1 CPU virtual

Las versiones 2.4.4 y posteriores de Cloud Composer introducen una estrategia diferente de asignación de recursos del activador para mejorar el ajuste del rendimiento. Si encuentras un error relacionado con la CPU del activador cuando realizas una actualización del entorno, significa que tus activadores actuales están configurados para usar más de 1 CPU virtual por activador.

Solución:

Cómo inspeccionar las advertencias de migración con errores

Cuando se actualiza Airflow a una versión posterior, a veces se aplican restricciones nuevas a la base de datos de Airflow. Si no se pueden aplicar estas restricciones, Airflow crea tablas nuevas para almacenar las filas para las que no se pudieron aplicar las restricciones. La IU de Airflow muestra un mensaje de advertencia hasta que se cambie el nombre o se descarten las tablas de datos movidas.

Solución:

Puedes usar los siguientes dos DAG para inspeccionar los datos movidos y cambiar el nombre de las tablas.

El DAG list_moved_tables_after_upgrade_dag enumera las filas que se movieron de cada tabla en la que no se pudieron aplicar restricciones. Inspecciona los datos y decide si quieres conservarlos. Para conservarlo, debes corregir manualmente los datos en la base de datos de Airflow. Por ejemplo, puedes volver a agregar las filas con los datos correctos.

Si no necesitas los datos o ya los corregiste, puedes ejecutar el DAG rename_moved_tables_after_upgrade_dag. Este DAG cambia el nombre de las tablas movidas. Las tablas y sus datos no se borran, por lo que puedes revisarlos más adelante.

"""
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
    )

La operación del entorno permanece en estado de error de forma indefinida

Los entornos de Cloud Composer 2 dependen de temas y suscripciones de Pub/Sub para comunicarse con los recursos ubicados en el proyecto de usuario de tu entorno durante las operaciones del entorno.

Si la API de Pub/Sub está inhabilitada en tu proyecto o si se borran los temas o las suscripciones del entorno, es posible que falle una operación del entorno y que permanezca en el estado de error de forma indefinida. Un entorno de este tipo se daña de forma irrevocable.

¿Qué sigue?