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

  • Se requiere el siguiente permiso para instalar paquetes de Python en el entorno de Cloud Composer: composer.environments.update. Para obtener más información, consulta Control de acceso de Cloud Composer.
  • 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.
  • Antes de implementar en producción, te recomendamos probar tus paquetes de PyPI localmente en un contenedor de trabajadores de Airflow.

Visualiza los paquetes instalados de Python

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

  1. Conéctate al clúster de GKE de tu entorno.
  2. Conéctate a un pod. Para acceder a los pods del clúster de GKE, usa comandos de kubectl que tengan en cuenta el espacio de nombres. Para ver todos los espacios de nombres, utiliza kubectl get pods --all-namespaces.
  3. Ejecuta pip freeze.

Por ejemplo:

gcloud container clusters get-credentials projects/composer-test-1/zones/us-central1-f/clusters/us-central1-1223232-gke --zone us-central1-f
Fetching cluster endpoint and auth data.
kubeconfig entry generated for us-central1-quickstart-f5da909c-gke.
~ (composer-test-1)$ kubectl exec -itn composer-1-7-2-airflow-1-9-0-0a9f265b airflow-worker-7858d4fb79-2dr9j -- /bin/bash
...
~ (composer-test-1)$ 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 la instalación de 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. Puedes 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 PyPI privado en tu red de VPC. Cuando instales dependencias, Cloud Composer ejecutará la operación dentro del clúster de IP privada de GKE que aloja tu entorno, sin acceder a ninguna dirección IP pública a través de Cloud Build.

Para instalar paquetes desde un repositorio privado alojado en tu red de VPC, sigue estos pasos:

  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 que se subió a la carpeta /config/pip/ del depósito de Cloud Storage.

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 dará como resultado más restricciones de seguridad. En particular, Cloud Build no se puede usar para la instalación del paquete, lo que impide el acceso directo a los repositorios en la Internet pública.

Para instalar las dependencias de Python en un entorno de Composer IP privado dentro de un perímetro, tienes algunas opciones:

  1. Usar un repositorio privado de PyPI alojado en tu red de VPC (como se describe en la sección anterior).
  2. Usa un servidor proxy en la red de VPC para conectarte a un repositorio de PyPI en la Internet pública. Especifica la dirección del proxy en el archivo /config/pip/pip.conf en el depósito de Cloud Storage.
  3. 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.
  4. Distribuye las dependencias de Python en la carpeta dags del depósito de Cloud Storage para instalarlas como bibliotecas locales. Esta opción no sería una buena opción si el árbol de dependencia 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 depósito 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.

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 redireccionar un puerto en 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')