Instalar dependencias de Python

En esta página, se describe cómo instalar paquetes de Python y conectarse al entorno de Cloud Composer desde algunas aplicaciones comunes.

Las dependencias se instalan con las dependencias de Python existentes que se incluyen en el entorno base.

Si tu entorno requiere un paquete específico, te recomendamos que lo instales explícitamente para evitar problemas debido a cambios en los paquetes en las versiones de las imágenes de Cloud Composer. No confíes en los paquetes preinstalados en la versión de Cloud Composer que se ejecuta en tu entorno.

Opciones para administrar dependencias

Si tu dependencia de Python no tiene dependencias externas y no entra en conflicto con las dependencias de Cloud Composer, puedes instalar dependencias de Python a partir del índice de paquetes de Python. También puedes instalar una dependencia de Python desde el repositorio de paquetes privado.

A continuación, se indican algunas opciones para otros requisitos.

Opción Caso en el que debe usarse
Biblioteca local de Python No se encuentra tu dependencia de Python en el índice de paquetes de Python y la biblioteca no tiene dependencias externas, como dist-packages.
Función Complementos Deseas usar la funcionalidad específica de un complemento, como la modificación de la interfaz web de Airflow.
PythonVirtualenvOperator Tu dependencia de Python está en el índice de paquetes de Python y no tiene dependencias externas. Sin embargo, no recomendamos que tu dependencia de Python se instale en todos los trabajadores o que la dependencia entre en conflicto con las dependencias requeridas para Cloud Composer.
KubernetesPodOperator

Necesitas dependencias externas que no se pueden instalar desde PIP, como dist-packages, o que se encuentran en un servidor PIP interno.

Esta opción requiere más configuración y mantenimiento y, en general, se debe considerar si las otras opciones no funcionan.

Antes de comenzar

  • Debes tener una función que pueda activar operaciones de actualización del entorno. Además, la cuenta de servicio del entorno debe tener una función que tenga permisos suficientes para realizar operaciones de actualización. Para obtener más información, consulta Control de acceso.
  • Si tu entorno está protegido por un perímetro de Controles del servicio de VPC, antes de instalar las dependencias de PyPI, debes otorgar identidades de usuario adicionales con acceso a los servicios que el perímetro de servicio protege y habilitar la compatibilidad para un repositorio privado de PyPI.
  • Los requisitos deben seguir el formato especificado en PEP-508 donde cada requisito se especifica en minúsculas y consta del nombre del paquete con extras opcionales y especificadores de versión.
  • Cuando instalas dependencias de Python personalizadas mediante la API, todos los procesos de Cloud Composer se ejecutan con dependencias de PyPI recién instaladas.
  • Las dependencias de PyPI personalizadas podrían causar conflictos con las dependencias que requiere Airflow, lo cual provoca inestabilidad.

Visualiza los paquetes instalados de Python

Haz lo siguiente para ver los paquetes de Python instalados en tu entorno:

  1. Determina el clúster y la zona de GKE del entorno de Cloud Composer.

    a. Usa el comando gcloud composer para mostrar las propiedades de un entorno de Cloud Composer:

    gcloud composer environments describe ENVIRONMENT_NAME \
        --location ENVIRONMENT_LOCATION
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • ENVIRONMENT_NAME es el nombre del entorno.
    • ENVIRONMENT_LOCATION es la región de Compute Engine donde se encuentra el entorno.

    b. En el resultado, el clúster aparece como gkeCluster.

    c. La zona en la que se implementa el clúster se muestra en la última parte de la propiedad location (config > nodeConfig > location). Por ejemplo, us-central1-b.

  2. Usa el comando gcloud composer para conectar el comando kubectl con el clúster.

    gcloud container clusters get-credentials GKE_CLUSTER --zone GKE_LOCATION
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • GKE_CLUSTER es el clúster.
    • GKE_LOCATION es la zona en la que se implementa el clúster.
  3. Ver y elegir un pod de trabajador de Airflow

    kubectl get pods --all-namespaces
    

    Busca un pod con un nombre como airflow-worker-1a2b3c-x0yz.

  4. Conéctate a una shell remota en un contenedor de trabajadores de Airflow.

    kubectl -n composer-1-14-4-airflow-example-namespace \
    exec -it airflow-worker-1a2b3c-x0yz -c airflow-worker -- /bin/bash
    

    Mientras estás conectado a la shell remota, el símbolo del sistema muestra el nombre del pod trabajador de Airflow, por ejemplo, airflow-worker-1a2b3c-x0yz.

  5. Ejecuta pip freeze.

    Por ejemplo:

    pip freeze
    
    absl-py==0.7.1
    adal==1.2.0
    asn1crypto==0.24.0
    astor==0.8.0
    attrs==19.1.0
    autopep8==1.4.4
    ...
    

Instala una dependencia de Python desde PyPI

Tu dependencia de Python no debe tener dependencias externas ni entrar en conflicto con las dependencias de Cloud Composer para instalar dependencias de Python del índice de paquetes de Python.

Haz lo siguiente para agregar, actualizar o borrar las dependencias de Python de tu entorno:

Console

Especifica el nombre del paquete y los especificadores de versión como se muestra aquí:

  • "pi-python-client", "==1.1.post1"
  • "go-api-python-client", "==1.0.0.dev187"

En el caso de un paquete sin el especificador de versión, usa una string vacía para el valor, como "glob2", " ".

Para acceder a las dependencias de Python de un entorno, navega a la página dependencias de PyPI con los siguientes pasos:

  1. Abre la página Entornos en Google Cloud Platform Console.

    Abrir la página Entornos

  2. Haz clic en el Nombre del entorno para el que deseas instalar, actualizar o borrar las dependencias de Python.

  3. Selecciona la pestaña Dependencias de PyPI.

  4. Haz clic en el botón Editar.

  5. Para agregar una dependencia nueva, sigue estos pasos:

    1. Haz clic en el botón Agregar dependencia.

    2. Ingresa el nombre y la versión de tu biblioteca en los campos Nombre y Versión.

  6. Haz lo siguiente para actualizar una dependencia existente:

    1. Selecciona el campo Nombre o Versión de la biblioteca que deseas actualizar.

    2. Ingresa un valor nuevo.

  7. Para borrar una dependencia, haz lo siguiente:

    1. Coloca el cursor sobre el nombre de la dependencia que quieres borrar.

    2. Haz clic en el ícono de papelera que aparece.

gcloud

Pasa un archivo requirements.txt a la herramienta de línea de comandos gcloud. Da formato al archivo con cada especificador de requisitos en una línea independiente.

Archivo de muestra requirements.txt:

scipy>=0.13.3
scikit-learn
nltk[machine_learning]

Pasa el archivo requirements.txt al comando environments.set-python-dependencies para configurar las dependencias de la instalación.

gcloud composer environments update ENVIRONMENT-NAME \\
--update-pypi-packages-from-file requirements.txt \\
--location LOCATION

El comando finaliza cuando termina la operación. Para no tener que esperar, usa la marca --async.

Si un conflicto de dependencia hace que la actualización falle, tu entorno continuará ejecutándose con las dependencias existentes. Si la operación tiene éxito, puedes comenzar a usar las dependencias de Python recién instaladas en tus DAG.

rest

Usa el método projects.locations.environments.patch y especifica config.softwareConfig.pypiPackages como prefijo del parámetro de consulta updateMask.

Instala una dependencia de Python desde un repositorio privado

Puedes instalar paquetes alojados en repositorios de paquetes privados disponibles en la Internet pública. Los paquetes deben ser paquetes configurados correctamente que la herramienta pip predeterminada pueda instalar.

Para realizar la instalación desde un repositorio de paquetes privado con una dirección pública, sigue estos pasos:

  1. Crea un archivo pip.conf y, además, incluye la siguiente información en el archivo, si corresponde:

    • Credenciales de acceso del repositorio
    • Opciones de instalación de pip no predeterminadas

      Ejemplo:

      [global]
      extra-index-url=https://my-example-private-repo.com/
      

  2. Sube el archivo pip.conf al depósito de Cloud Storage de tu entorno y colócalo en la carpeta /config/pip/, por ejemplo: gs://us-central1-b1-6efannnn-bucket/config/pip/pip.conf

Instala una dependencia de Python en un entorno de IP privada

Un entorno de IP privada restringe el acceso a la Internet pública, por lo que instalar dependencias de Python puede requerir pasos adicionales.

Cuando se instalan dependencias desde un repositorio público de PyPI, no se requiere una configuración especial. Puede seguir el proceso normal descrito anteriormente. También puedes solicitar paquetes desde un repositorio privado con una dirección pública.

Como alternativa, puedes alojar un repositorio privado de PyPI en tu red de VPC. Cuando se instalan dependencias, Cloud Composer ejecutará la operación dentro del clúster de GKE de la IP privada que aloja tu entorno, sin acceder a cualquier dirección IP pública a través de Cloud Build.

Para instalar paquetes desde un repositorio privado alojado en tu red de VPC:

  1. Si la cuenta de servicio para tu entorno de Cloud Composer no tiene la función project.editor, otórgale la función iam.serviceAccountUser.

  2. Especifica la dirección IP privada del repositorio en el archivo pip.conf subido a la carpeta /config/pip/ en el depósito de Cloud Storage.

Instala una dependencia de Python en un entorno de IP privada en restricciones de ubicación de recursos

Mantener el proyecto en regla con los requisitos de restricción de ubicación de recursos prohíbe el uso de algunas herramientas. En particular, Cloud Build no se puede usar para la instalación del paquete, lo que evita el acceso directo a los repositorios en la Internet pública.

Con el fin de instalar dependencias de Python en ese entorno, debes seguir uno de los enfoques descritos a continuación para entornos de IP privados con un perímetro de VPC-SC.

Instala una dependencia de Python en un entorno de IP privada en un perímetro de Controles del servicio de VPC

Proteger tu proyecto con un perímetro de los Controles del servicio de VPC genera restricciones de seguridad adicionales. En particular, Cloud Build no se puede usar para la instalación del paquete, lo que evita el acceso directo a los repositorios en la Internet pública.

Si quieres instalar dependencias de Python para un entorno de IP privada de un perímetro dentro de un perímetro, existen algunas opciones:

  • Usar un repositorio privado de PyPI alojado en tu red de VPC (como se describe en la sección anterior).
  • Usa un servidor proxy en tu red de VPC para conectarte a un repositorio de PyPI en la Internet pública. Especifica la dirección de proxy en el archivo /config/pip/pip.conf en el depósito de Cloud Storage.
  • Si tu política de seguridad permite el acceso a la red de VPC desde direcciones IP externas, puedes habilitar esta opción mediante la configuración de Cloud NAT.
  • Utiliza un proveedor de las dependencias de Python en la carpeta dags del depósito de Cloud Storage para instalarlas como bibliotecas locales. Esta no es una buena opción si el árbol de dependencias es grande.

Instala una biblioteca local de Python

Para instalar una biblioteca interna o local de Python, sigue estos pasos:

  1. Coloca las dependencias dentro de un subdirectorio en la carpeta dags/. Para importar un módulo desde un subdirectorio, cada uno de los subdirectorios de la ruta del módulo debe contener un archivo de marcador de paquete __init__.py.

    En este ejemplo, la dependencia es coin_module.py:

    dags/
      use_local_deps.py  # A DAG file.
      dependencies/
        __init__.py
        coin_module.py
    
  2. Importa la dependencia desde el archivo de definición de DAG.

    Por ejemplo:

    from dependencies import coin_module

Utiliza paquetes de Python que dependen de bibliotecas de objetos compartidos

Algunos paquetes de PyPI dependen de las bibliotecas a nivel del sistema. Si bien Cloud Composer no es compatible con las bibliotecas del sistema, puedes usar las siguientes opciones:

  1. Utiliza KubernetesPodOperator. Configura la imagen del operador en una imagen de compilación personalizada. Si experimentas paquetes que fallan durante la instalación debido a una dependencia no satisfecha del sistema, usa esta opción.

  2. Sube las bibliotecas de objetos compartidos al bucket de Cloud Storage de tu entorno.

    1. Busca manualmente las bibliotecas de objetos compartidos para la dependencia de PyPI (un archivo .so).
    2. Sube las bibliotecas de objetos compartidos a /home/airflow/gcs/plugins.
    3. Configura la siguiente variable de entorno de Cloud Composer: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/airflow/gcs/plugins

    Si tus paquetes de PyPI se instalaron correctamente, pero fallan en el entorno de ejecución, esta es una opción.

Verifica que el paquete de PyPI no tenga errores

Las dependencias de PyPI pueden causar conflictos que pueden ser difíciles de resolver sin probar la instalación del paquete para ver la causa de un conflicto. Para probar la instalación del paquete, puedes instalar paquetes de Python de manera local en un contenedor de trabajador de Airflow y verificar si hay conflictos.

  1. Determina el clúster y la zona de GKE del entorno de Cloud Composer.

    a. Usa el comando gcloud composer para mostrar las propiedades de un entorno de Cloud Composer:

    gcloud composer environments describe ENVIRONMENT_NAME \
        --location ENVIRONMENT_LOCATION
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • ENVIRONMENT_NAME es el nombre del entorno.
    • ENVIRONMENT_LOCATION es la región de Compute Engine donde se encuentra el entorno.

    b. En el resultado, el clúster aparece como gkeCluster.

    c. La zona en la que se implementa el clúster se muestra en la última parte de la propiedad location (config > nodeConfig > location). Por ejemplo, us-central1-b.

  2. Usa el comando gcloud composer para conectar el comando kubectl con el clúster.

    gcloud container clusters get-credentials GKE_CLUSTER --zone GKE_LOCATION
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • GKE_CLUSTER es el clúster.
    • GKE_LOCATION es la zona en la que se implementa el clúster.
  3. Ver y elegir un pod de trabajador de Airflow

    kubectl get pods --all-namespaces
    

    Busca un pod con un nombre como airflow-worker-1a2b3c-x0yz.

  4. Conéctate a una shell remota en un contenedor de trabajadores de Airflow.

    kubectl -n composer-1-14-4-airflow-example-namespace \
    exec -it airflow-worker-1a2b3c-x0yz -c airflow-worker -- /bin/bash
    

    Mientras estás conectado a la shell remota, el símbolo del sistema muestra el nombre del pod trabajador de Airflow, por ejemplo, airflow-worker-1a2b3c-x0yz.

  5. Para la versión de Python que se ejecuta en tu entorno, instala el paquete de Python en el contenedor de trabajadores de Airflow, por ejemplo:

    sudo python3 -m pip install PACKAGE
    

    Reemplaza PACKAGE por el nombre del paquete de PyPI que deseas probar.

  6. Prueba la compatibilidad en el contenedor de trabajadores de Airflow. Puedes subir un DAG que use el paquete y, luego, comprobar si funciona correctamente.

    • Comprueba si hay errores de sintaxis.
    airflow list_dags
    
    • Procesa la plantilla.
    airflow test --dry_run DAG_ID TASK_ID EXECUTION_DATE
    

    Reemplaza lo siguiente:

    • DAG_ID es el ID del DAG.
    • TASK_ID es el ID de la tarea.
    • EXECUTION_DATE es la fecha de ejecución del DAG. Esta fecha se usa para plantillas. Independientemente de la fecha que especifiques aquí, el DAG se ejecuta de inmediato.

    • Comprueba si hay errores en la tarea.

    airflow test DAG_ID TASK_ID EXECUTION_DATE
    
  7. Desinstala el paquete de Python del contenedor de trabajadores de Airflow:

    sudo python3 -m pip uninstall PACKAGE
    

Conéctate a la interfaz web de Flower

Flower es una herramienta basada en la Web para trabajar con clústeres de Celery. Flower está preinstalada en tu entorno. Puedes usar su IU web para supervisar a los trabajadores de Apache Airflow de tu entorno.

Para acceder a Flower, haz lo siguiente:

  1. Consulta tu entorno para determinar el clúster de Kubernetes Engine:

    gcloud composer environments describe ENVIRONMENT-NAME \
        --location LOCATION

    El clúster figura como gkeCluster. La zona en la que se implementa el clúster se muestra como location.

    Por ejemplo:

          gcloud composer environments describe environment-name --location us-central1
          config:
            airflowUri: https://uNNNNe0aNNbcd3fff-tp.appspot.com
            dagGcsPrefix: gs://us-central1-may18-test-00a47695-bucket/dags
            gkeCluster: projects/example-project/zones/us-central1-a/clusters/us-central1-environment-name-00a47695-gke
            nodeConfig:
              diskSizeGb: 100
              location: projects/example-project/zones/us-central1-a

    En el ejemplo, el clúster es us-central1-environment-name-00a47695-gke y la zona es us-central1-a. Esta información también está disponible en la página Detalles del entorno en Cloud Console.

  2. Conéctate al clúster de Kubernetes Engine:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone CLUSTER_ZONE

    Por ejemplo:

    gcloud container clusters get-credentials us-central1-environment-name-00a47695-gke --zone us-central1-a
    
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for us-central1-environment-name-00a47695-gke.
  3. Visualiza los pods de trabajador y selecciona el pod en el que se ejecutará Flower:

    kubectl get pods --all-namespaces | grep worker

    Por ejemplo:

    kubectl get pods --all-namespaces | grep worker
    
    airflow-worker-89696c45f-49rkb      2/2       Running   1          29d
    airflow-worker-89696c45f-gccmm      2/2       Running   1          29d
    airflow-worker-89696c45f-llnnx      2/2       Running   0          29d

    Los nombres de pod coinciden con la regex "airflow-(worker|scheduler)-[-a-f0-9]+").

  4. Ejecuta Flower en el pod trabajador:

    kubectl exec -n NAMESPACE -it POD_NAME -c airflow-worker -- airflow flower

    Por ejemplo:

    kubectl exec -n composer-1-6-0-airflow-1-10-1-9670c487 -it airflow-worker-89696c45f-llnnx /
        -c airflow-worker -- airflow flower
    
    [I 180601 20:35:55 command:139] Visit me at http://0.0.0.0:5555
    [I 180601 20:35:55 command:144] Broker: redis://airflow-redis-service.default.svc.cluster.local:6379/0
  5. En una sesión de terminal independiente, usa kubectl para reenviar un puerto de tu máquina local al pod que ejecuta la IU de Flower:

    kubectl -n NAMESPACE port-forward POD_NAME 5555

    Por ejemplo:

    kubectl -n composer-1-6-0-airflow-1-10-1-9670c487 port-forward airflow-worker-c5c4b58c7-zhmkv 5555
    
    Forwarding from 127.0.0.1:5555 -> 5555
  6. Para acceder a la IU web, ve a http://localhost:5555 en tu navegador local.

Instala SQLAlchemy para acceder a la base de datos de Airflow

SQLAlchemy es un kit de herramientas de Python SQL y el Asignador relacional de objetos (ORM). Puedes instalar SQLAlchemy y usarlo a fin de acceder a la instancia de Cloud SQL para Cloud Composer. Durante la instalación, Cloud Composer configura la variable de entorno de Airflow AIRFLOW__CORE__SQL_ALCHEMY_CONN.

Para instalar SQLAlchemy, sigue estos pasos:

  1. Instala sqlalchemy en tu entorno.

    gcloud composer environments update ENVIRONMENT-NAME /
        --location LOCATION /
        --update-pypi-package "sqlalchemy"
    
  2. Consulta tu entorno para determinar el clúster de Kubernetes Engine:

    gcloud composer environments describe ENVIRONMENT-NAME /
        --location LOCATION
  3. Conéctate al clúster de Kubernetes Engine:

    gcloud container clusters get-credentials CLUSTER_NAME /
        --zone CLUSTER_LOCATION
  4. Ve los pods trabajadores y selecciona el pod al que te conectarás:

    kubectl get pods --all-namespaces | grep worker
  5. Establece una conexión SSH con el pod trabajador:

    kubectl -n NAMESPACE exec -it POD_NAME -c airflow-worker -- /bin/bash

    Por ejemplo:

    kubectl -n composer-1-6-0-airflow-1-10-1-9670c487 /
        exec -it airflow-worker-54c6b57789-66pnr -c airflow-worker -- /bin/bash
    airflow@airflow-worker-54c6b57789-66pnr:~$

  6. Usa la biblioteca sqlalchemy para interactuar con la base de datos de Airflow:

    python
    import airflow.configuration as config
    config.conf.get('core', 'sql_alchemy_conn')