Configurar o ambiente Python do Dataproc

Os jobs do PySpark no Dataproc são executados por um interpretador do Python no cluster. O código do job precisa ser compatível no ambiente de execução com a versão do interpretador do Python e dependências.

Verificar a versão e os módulos do intérprete

O programa de amostra check_python_env.py a seguir verifica o usuário do Linux que executa o job, o interpretador do Python e os módulos disponíveis.

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

Execute o programa

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

Exemplo de saída

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

Ambientes Python de imagem do Dataproc

As seções a seguir descrevem os ambientes Python para diferentes clusters de versões de imagem do Dataproc.

Versão de imagem do Dataproc 1.5

O Miniconda3 está instalado em clusters do Dataproc 1.5. O interpretador padrão é Python 3.7, localizado na instância de VM em /opt/conda/miniconda3/bin/python3.7, respectivamente. O Python 2.7 também está disponível em /usr/bin/python2.7.

É possível instalar pacotes conda e pip no ambiente base ou configurar seu próprio ambiente conda no cluster usando as propriedades de cluster relacionadas ao Conda.

Para usar o Python 2.7 como intérprete padrão em clusters 1.5, não use o componente opcional Anaconda ao criar o cluster. Em vez disso, use a ação de inicialização do conda para instalar o Miniconda2 e as propriedades de cluster relacionadas ao conda para instalar os pacotes conda e pip no ambiente base ou configure seu próprio ambiente conda no cluster.

Exemplo

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'

Versão de imagem do Dataproc 2.x

O conda está instalado na Clusters do Dataproc 2.x. O interpretador padrão do Python3 está localizado na instância de VM em /opt/conda/default/bin. As páginas a seguir listam a versão do Python incluída nas versões de imagem do Dataproc:

O interpretador Python não padrão do SO está disponível em /usr/bin/.

É possível instalar pacotes conda e pip no ambiente base ou configurar seu próprio ambiente conda no cluster usando as propriedades de cluster relacionadas ao Conda.

Exemplo

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'

Observação: o Anaconda não está disponível para clusters do Dataproc 2.0.

Como escolher um intérprete do Python para um job

Se vários interpretadores do Python estiverem instalados no cluster, o sistema executará /etc/profile.d/effective-python.sh, que exporta a variável de ambiente PYSPARK_PYTHON para escolher o interpretador padrão do Python para os jobs do PySpark. Se você precisar de um interpretador Python não padrão para um job PySpark, ao enviar o job para o cluster, defina as propriedades spark.pyspark.python e spark.pyspark.driver.python com o número de versão necessário do Python (por exemplo, "python2.7" ou "python3.6").

Exemplo

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 com sudo

Se você fizer SSH em um nó de cluster que tenha o Miniconda ou o Anaconda instalado, quando você executa sudo python --version, a versão do Python exibida pode ser diferente da versão exibida pelo python --version. Essa diferença de versão pode ocorrer porque o sudo usa o sistema Python padrão /usr/bin/python e não executa /etc/profile.d/effective-python.sh para inicializar o ambiente Python. Para uma experiência consistente ao usar sudo, localize o caminho do Python definido em /etc/profile.d/effective-python.sh e execute o comando env para definir o PATH como esse caminho do Python. Confira um exemplo de cluster 1.5:

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

É possível personalizar o ambiente conda durante a criação do cluster usando as propriedades de cluster relacionadas ao Conda.

Há duas maneiras mutuamente exclusivas de personalizar o ambiente da Conda ao criar um cluster do Dataproc:

  1. Use a propriedade do cluster dataproc:conda.env.config.uri para criar e ativar um novo ambiente conda no cluster. ou

  2. Usar os clusters dataproc:conda.packages e dataproc:pip.packages propriedades para adicionar pacotes conda e pip, respectivamente, ao conda base no cluster.

  • dataproc:conda.env.config.uri: o caminho absoluto para um arquivo de configuração YAML do ambiente Conda localizado no Cloud Storage. Esse arquivo será usado para criar e ativar um novo ambiente conda no cluster.

    Exemplo:

    1. Receba ou crie um arquivo de configuração environment.yaml do Conda. É possível criar manualmente o arquivo, usar um arquivo atual ou exportar um ambiente Conda para um arquivo environment.yaml, conforme mostrado abaixo.

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

    2. Copie o arquivo de configuração para o bucket do Cloud Storage.

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

    3. Crie o cluster e aponte para o arquivo de configuração do ambiente no 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:uma lista de condapacotes com versões específicas a serem instaladas no ambiente base, formatadas como pkg1==v1,pkg2==v2.... Se o conda não resolver conflitos com pacotes atuais no ambiente de base, os pacotes em conflito não serão instalados.

    Observações:

    • As propriedades de cluster dataproc:conda.packages e dataproc:pip.packages não podem ser usadas com a propriedade de cluster dataproc:conda.env.config.uri.

    • Ao especificar vários pacotes (separados por vírgula), você precisa especificar um caractere delimitador alternativo. Veja a propriedade Formatação do cluster. O exemplo a seguir especifica "#" como o caractere delimitador para transmitir vários nomes de pacotes separados por vírgulas para a propriedade dataproc:conda.packages.

    Exemplo:

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:uma lista de pacotes pip com pacotes específicos sejam instaladas no ambiente base, formatadas como pkg1==v1,pkg2==v2.... O pip atualiza as dependências atuais apenas se for necessário. Os conflitos podem tornar o ambiente inconsistente.

    Observações:

    • As propriedades de cluster dataproc:pip.packages e dataproc:conda.packages não podem ser usadas com a propriedade de cluster dataproc:conda.env.config.uri.

    • Ao especificar vários pacotes (separados por vírgula), você precisa especificar um caractere delimitador alternativo. Veja a propriedade Formatação do cluster. O exemplo a seguir especifica "#" como o caractere delimitador para transmitir vários nomes de pacotes separados por vírgulas para a propriedade dataproc:pip.packages.

    Exemplo:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:pip.packages=tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...
  • É possível usar dataproc:conda.packages e dataproc:pip.packages ao criar um cluster.

    Exemplo:

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