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

Evite problemas de transferência de pacotes

Os nós do cluster do Dataproc transferem pacotes de repositórios públicos Python externos quando instalam pacotes conda e pip personalizados (consulte as propriedades do cluster relacionadas com o conda). Para evitar falhas na criação de clusters devido à indisponibilidade de repositórios públicos do Python, considere criar uma imagem personalizada do Dataproc ou carregar as dependências para um contentor do Cloud Storage (consulte Transferir dependências com clusters apenas de IP interno).

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 estabelecer ligação a um nó do cluster com o Miniconda ou o Anaconda instalado através de SSH, 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 através do seguinte comando:

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