Configurar o ambiente Python do cluster

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 e as dependências do interpretador do Python.

Como 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

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

Versões de imagem 1.0, 1.1 e 1.2 do Dataproc

Nos clusters de versão 1.0, 1.1 e 1.2 da imagem, o interpretador padrão do Python é o Python 2.7, localizado na instância de VM em /usr/bin/python2.7. É possível instalar pacotes Python por meio da ação de inicialização de instalação do pip (especificar versões do pacote, conforme mostrado no exemplo a seguir, é opcional, mas recomendado).

Exemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.2 \
    --region=${REGION} \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Se você precisar de outro interpretador do Python, poderá usar a ação de inicialização do conda para instalar o Miniconda com pacotes Conda e PIP.

Exemplo

O próximo comando cria um cluster do Dataproc da versão da imagem 1.2 e instala a versão mais recente do Miniconda3 com pacotes Conda e PIP:

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.2 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=3' \
    --metadata='MINICONDA_VERSION=latest' \
    --metadata='CONDA_PACKAGES=scipy=1.0.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh,gs://goog-dataproc-initialization-actions-${REGION}/conda/install-conda-env.sh

Versão de imagem do Dataproc 1.3

Nos clusters de versão de imagem 1.3, o interpretador padrão do Python é o Python 2.7, instalado na instância de VM em /usr/bin/python2.7. Você pode instalar pacotes Python com a ação de inicialização de instalação do pip.

Exemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.3 \
    --region=${REGION} \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Se você precisar de um interpretador diferente do Python, poderá criar um cluster com o componente opcional Anaconda e usar a ação de inicialização do pip install para instalar pacotes Conda e PIP.

Exemplo

O próximo comando cria um cluster de versão de imagem 1.3 e instala os pacotes Anaconda2, Conda e PIP:

REGION=region
gcloud beta dataproc clusters create my-cluster \
    --image-version=1.3 \
    --region=${REGION} \
    --optional-components=ANACONDA \
    --metadata='CONDA_PACKAGES=scipy=1.1.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/conda-install.sh,gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Ao instalar o componente opcional Anaconda, o interpretador padrão do Python para jobs do PySpark é /opt/conda/anaconda/bin/python2.7.

Para usar o Python 3 como intérprete padrão em um cluster 1.3, não use o componente opcional Anaconda ao criar o cluster. Em vez disso, use a ação de inicialização conda para instalar o Miniconda3 e os pacotes Conda e PIP no cluster.

Exemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.3 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=3' \
    --metadata='MINICONDA_VERSION=latest' \
    --metadata='CONDA_PACKAGES=scipy=1.0.0 tensorflow=1.12.0' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh,gs://goog-dataproc-initialization-actions-${REGION}/conda/install-conda-env.sh

Versão de imagem do Dataproc 1.4+

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

Você pode instalar pacotes Conda e PIP com a ação de inicialização conda e a ação de inicialização de instalação do pip.

Exemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.4 \
    --region=${REGION} \
    --metadata='CONDA_PACKAGES=scipy=1.1.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/conda-install.sh,gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Para instalar o Anaconda3 em vez do Miniconda3, escolha o componente opcional Anaconda e instale os pacotes Conda e PIP com a ação de inicialização conda e a ação de inicialização do pip.

Exemplo

REGION=region
gcloud beta dataproc clusters create my-cluster \
    --image-version=1.4 \
    --region=${REGION} \
    --optional-components=ANACONDA \
    --metadata='CONDA_PACKAGES=scipy=1.1.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/conda-install.sh,gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Quando você instala o componente opcional Anaconda3, o Miniconda3 é removido do cluster e /opt/conda/anaconda3/bin/python3.6 se torna o interpretador padrão do Python para jobs do PySpark. Não é possível alterar a versão do interpretador Python do componente opcional.

Para usar o Python 2.7 como intérprete padrão em um cluster 1.4+, não use o componente opcional Anaconda ao criar o cluster. Em vez disso, use a ação de inicialização conda para instalar o Miniconda2 e os pacotes Conda e PIP no cluster.

Exemplo

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.4 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --metadata='CONDA_PACKAGES=scipy=1.0.0 tensorflow=1.12.0' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh,gs://goog-dataproc-initialization-actions-${REGION}/conda/install-conda-env.sh

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

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. Veja um exemplo de cluster 1.4:

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