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
Use propriedades de cluster relacionadas com o conda
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:
Use a propriedade
dataproc:conda.env.config.uricluster para criar e ativar um novo ambiente conda no cluster. ouUse as propriedades
dataproc:conda.packagesedataproc:pip.packagesdo cluster para adicionar, respetivamente, pacotescondaepipao ambientecondabaseno cluster.
propriedades do cluster relacionadas com o conda
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 ambientecondano cluster.Exemplo:
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 ficheiroenvironment.yamlatravés do seguinte comando:conda env export --name=env-name > environment.yaml
Copie o ficheiro de configuração para o seu contentor do Cloud Storage.
gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
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 decondapacotes com versões específicas a instalar no ambiente base, formatada comopkg1==v1,pkg2==v2.... Secondanã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.packagesedataproc:pip.packagesde cluster com a propriedade de clusterdataproc: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 pacotespipcom versões específicas a instalar no ambiente base, formatada comopkg1==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.packagesedataproc:conda.packagescom a propriedade de clusterdataproc: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.packagesedataproc:pip.packagesquando 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 ...