Configurar el entorno de Python de Dataproc

Las tareas de PySpark en Dataproc se ejecutan mediante un intérprete de Python en el clúster. El código de la tarea debe ser compatible en el tiempo de ejecución con la versión del intérprete de Python y las dependencias.

Comprobar la versión del intérprete y los módulos

El siguiente programa de ejemplo check_python_env.py comprueba el usuario de Linux que ejecuta el trabajo, el intérprete de Python y los módulos disponibles.

import getpass
import sys
import imp

print('This job is running as "{}".'.format(getpass.getuser()))
print(sys.executable, sys.version_info)
for package in sys.argv[1:]:
  print(imp.find_module(package))

Ejecutar el programa

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    -- pandas scipy

Ejemplo de salida

This job is running as "root".
('/usr/bin/python', sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0))
(None, '/usr/local/lib/python2.7/dist-packages/pandas', ('', '', 5))
(None, '/usr/local/lib/python2.7/dist-packages/scipy', ('', '', 5))

Entornos de Python de imágenes de Dataproc

En las siguientes secciones se describen los entornos de Python de los diferentes clústeres de versiones de imágenes de Dataproc.

Versión 1.5 de la imagen de Dataproc

Miniconda3 está instalado en los clústeres de Dataproc 1.5. El intérprete predeterminado es Python 3.7, que se encuentra en la instancia de VM en /opt/conda/miniconda3/bin/python3.7, respectivamente. Python 2.7 también está disponible en /usr/bin/python2.7.

Puedes instalar paquetes de conda y pip en el entorno de base o configurar tu propio entorno de conda en el clúster mediante propiedades de clúster relacionadas con conda.

Para usar Python 2.7 como intérprete predeterminado en clústeres 1.5, no uses el componente opcional Anaconda al crear el clúster. En su lugar, usa la acción de inicialización de conda para instalar Miniconda2 y las propiedades de clúster relacionadas con conda para instalar los paquetes conda y pip en el entorno base o configura tu propio entorno conda en el clúster.

Ejemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.5 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh \
    --properties=^#^dataproc:conda.packages='pytorch==1.0.1,visions==0.7.1'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

Versión de imagen de Dataproc 2.x

conda está instalado en clústeres de Dataproc 2.x. El intérprete de Python 3 predeterminado se encuentra en la instancia de VM en /opt/conda/default/bin. En las siguientes páginas se indica la versión de Python incluida en las versiones de imagen de Dataproc:

El intérprete de Python no predeterminado del SO está disponible en /usr/bin/.

Puedes instalar los paquetes conda y pip en el entorno base o configurar tu propio entorno conda en el clúster mediante las propiedades del clúster relacionadas con conda.

Ejemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=2.0 \
    --region=${REGION} \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

Nota: Anaconda no está disponible en los clústeres de Dataproc 2.0.

Elegir un intérprete de Python para un trabajo

Si hay varios intérpretes de Python instalados en tu clúster, el sistema ejecuta /etc/profile.d/effective-python.sh, que exporta la variable de entorno PYSPARK_PYTHON para elegir el intérprete de Python predeterminado de tus trabajos de PySpark. Si necesitas un intérprete de Python que no sea el predeterminado para una tarea de PySpark, cuando envíes la tarea a tu clúster, asigna a las propiedades spark.pyspark.python y spark.pyspark.driver.python el número de versión de Python que necesites (por ejemplo, "python2.7" o "python3.6").

Ejemplo

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    --properties="spark.pyspark.python=python2.7,spark.pyspark.driver.python=python2.7"

Python con sudo

Si accedes a un nodo de clúster mediante SSH que tenga instalado Miniconda o Anaconda, al ejecutar sudo python --version, la versión de Python que se muestre puede ser diferente de la versión que se muestre al ejecutar python --version. Esta diferencia de versión puede deberse a que sudo usa el Python del sistema predeterminado/usr/bin/python y no ejecuta /etc/profile.d/effective-python.sh para inicializar el entorno de Python. Para disfrutar de una experiencia coherente al usar sudo, busca la ruta de Python definida en /etc/profile.d/effective-python.sh y, a continuación, ejecuta el comando env para definir PATH en esta ruta de Python. Aquí tienes un ejemplo de clúster 1.5:

sudo env PATH=/opt/conda/default/bin:${PATH} python --version

Puedes personalizar el entorno conda durante la creación del clúster mediante propiedades del clúster relacionadas con conda.

Hay dos formas mutuamente excluyentes de personalizar el entorno de conda al crear un clúster de Dataproc:

  1. Usa la propiedad de clúster dataproc:conda.env.config.uri para crear y activar un nuevo entorno de conda en el clúster. o

  2. Usa las propiedades de clúster dataproc:conda.packages y dataproc:pip.packages para añadir los paquetes conda y pip, respectivamente, al entorno conda base del clúster.

  • dataproc:conda.env.config.uri: ruta absoluta a un archivo de configuración YAML del entorno de conda ubicado en Cloud Storage. Este archivo se usará para crear y activar un nuevo entorno conda en el clúster.

    Ejemplo:

    1. Obtén o crea un archivo de configuración de conda environment.yaml. Puedes crear el archivo manualmente, usar un archivo que ya tengas o exportar un entorno de conda a un archivo environment.yaml, como se muestra a continuación.

      conda env export --name=env-name > environment.yaml
      

    2. Copia el archivo de configuración en tu segmento de Cloud Storage.

      gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
      

    3. Crea el clúster y apunta al archivo de configuración de tu entorno en Cloud Storage.

      REGION=region
      gcloud dataproc clusters create cluster-name \
          --region=${REGION} \
          --properties='dataproc:conda.env.config.uri=gs://bucket-name/environment.yaml' \
          ... other flags ...
      

  • dataproc:conda.packages: lista de condapaquetes con versiones específicas que se instalarán en el entorno base, con el formato pkg1==v1,pkg2==v2.... Si conda no puede resolver los conflictos con los paquetes del entorno base, los paquetes en conflicto no se instalarán.

    Notas:

    • Las propiedades de clúster dataproc:conda.packages y dataproc:pip.packages no se pueden usar con la propiedad de clúster dataproc:conda.env.config.uri.

    • Cuando especifique varios paquetes (separados por comas), debe indicar un carácter delimitador alternativo (consulte la propiedad de clúster Formato). En el siguiente ejemplo se especifica "#" como carácter delimitador para transferir varios nombres de paquetes separados por comas a la propiedad dataproc:conda.packages.

    Ejemplo:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:conda.packages=pytorch==1.7.1,coverage==5.5' \
    ... other flags ...

  • dataproc:pip.packages: lista de paquetes de pip con versiones específicas que se instalarán en el entorno base, con el formato pkg1==v1,pkg2==v2.... `pip actualizará las dependencias solo si es necesario. Los conflictos pueden provocar que el entorno sea incoherente.

    Notas:

    • Las propiedades de clúster dataproc:pip.packages y dataproc:conda.packages no se pueden usar con la propiedad de clúster dataproc:conda.env.config.uri.

    • Cuando especifique varios paquetes (separados por comas), debe indicar un carácter delimitador alternativo (consulte la propiedad de clúster Formato). En el siguiente ejemplo se especifica "#" como carácter delimitador para transferir varios nombres de paquetes separados por comas a la propiedad dataproc:pip.packages.

    Ejemplo:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:pip.packages=tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...
  • Puedes usar dataproc:conda.packages y dataproc:pip.packages al crear un clúster.

    Ejemplo:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --image-version=1.5 \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...