Configure o ambiente Python do Dataproc

As tarefas do PySpark no Dataproc são executadas por um intérprete Python no cluster. O código de tarefa tem de ser compatível no tempo de execução com a versão do interpretador Python e as dependências.

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

O seguinte programa de exemplo check_python_env.pyverifica o utilizador do Linux que executa a tarefa, o intérprete 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 imagens do Dataproc

As secções seguintes descrevem os ambientes Python para diferentes clusters de versão de imagem do Dataproc.

Versão 1.5 da imagem do Dataproc

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

Pode instalar pacotes conda e pip no ambiente base ou configurar o seu próprio ambiente conda no cluster através das propriedades do cluster relacionadas com o conda.

Para usar o Python 2.7 como o intérprete predefinido em clusters 1.5, não use o componente opcional Anaconda ao criar o cluster. Em alternativa, use a ação de inicialização do conda para instalar o Miniconda2 e use as propriedades do cluster relacionadas com o conda para instalar os pacotes conda e pip no ambiente base ou configurar o 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 2.x da imagem do Dataproc

O conda está instalado em clusters do Dataproc 2.x. O intérprete Python3 predefinido encontra-se na instância de VM em /opt/conda/default/bin. As páginas seguintes listam a versão do Python incluída nas versões de imagens do Dataproc:

O intérprete Python não predefinido do SO está disponível em /usr/bin/.

Pode instalar pacotes conda e pip no ambiente base ou configurar o seu próprio ambiente conda no cluster através de propriedades do cluster relacionadas com o 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'

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

Escolha um intérprete Python para uma tarefa

Se tiver vários intérpretes Python instalados no cluster, o sistema executa /etc/profile.d/effective-python.sh, que exporta a variável de ambiente PYSPARK_PYTHON para escolher o intérprete Python predefinido para as tarefas do PySpark. Se precisar de um intérprete Python não predefinido para uma tarefa PySpark, quando enviar a tarefa para o cluster, defina as propriedades spark.pyspark.python e spark.pyspark.driver.python para o número da versão do Python necessário (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 usar SSH para aceder a um nó do cluster com o Miniconda ou o Anaconda instalado, quando executar sudo python --version, a versão do Python apresentada pode ser diferente da versão apresentada por python --version. Esta diferença de versão pode ocorrer porque o sudo usa o Python do sistema predefinido/usr/bin/python e não executa o comando /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, em seguida, execute o comando env para definir o PATH para este caminho do Python. Segue-se um exemplo de um cluster de 1,5:

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

Pode personalizar o ambiente condadurante a criação do cluster através de propriedades do cluster relacionadas com o conda.

Existem duas formas mutuamente exclusivas de personalizar o ambiente conda quando cria um cluster do Dataproc:

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

  2. Use as propriedades dataproc:conda.packages e dataproc:pip.packages do cluster para adicionar, respetivamente, pacotes conda e pip ao ambiente conda base no cluster.

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

    Exemplo:

    1. Obtenha ou crie um ficheiro de configuração do conda environment.yaml. Pode criar manualmente o ficheiro, usar um ficheiro existente ou exportar um ambiente conda existente para um ficheiro environment.yaml, conforme mostrado abaixo.

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

    2. Copie o ficheiro de configuração para o seu contentor do Cloud Storage.

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

    3. Crie o cluster e aponte para o ficheiro 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 instalar no ambiente base, formatada como pkg1==v1,pkg2==v2.... Se conda não conseguir resolver os conflitos com os pacotes existentes no ambiente base, os pacotes em conflito não são instalados.

    Notas:

    • Não é possível usar as propriedades dataproc:conda.packages e dataproc:pip.packages de cluster com a propriedade de cluster dataproc:conda.env.config.uri.

    • Quando especificar vários pacotes (separados por uma vírgula), tem de especificar um carácter delimitador alternativo (consulte a propriedade do cluster Formatação). O exemplo seguinte especifica "#" como o caráter delimitador para transmitir vários nomes de pacotes separados por vírgulas à 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 versões específicas a instalar no ambiente base, formatada como pkg1==v1,pkg2==v2.... `pip will upgrade existing dependencies only if required. Os conflitos podem fazer com que o ambiente seja inconsistente.

    Notas:

    • Não é possível usar as propriedades de cluster dataproc:pip.packages e dataproc:conda.packages com a propriedade de cluster dataproc:conda.env.config.uri.

    • Quando especificar vários pacotes (separados por uma vírgula), tem de especificar um carácter delimitador alternativo (consulte a propriedade do cluster Formatação). O exemplo seguinte especifica "#" como o caráter delimitador para transmitir vários nomes de pacotes separados por vírgulas à 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 ...
  • Pode usar dataproc:conda.packages e dataproc:pip.packages quando cria 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 ...