Como faço para definir a versão do driver python no spark?

87

Estou usando o spark 1.4.0-rc2, então posso usar o python 3 com o spark. Se eu adicionar export PYSPARK_PYTHON=python3ao meu arquivo .bashrc, poderei executar o spark interativamente com o python 3. No entanto, se eu quiser executar um programa autônomo no modo local, recebo um erro:

Exception: Python in worker has different version 3.4 than that in driver 2.7, PySpark cannot run with different minor versions

Como posso especificar a versão do python para o driver? A configuração export PYSPARK_DRIVER_PYTHON=python3não funcionou.

Kevin
fonte

Respostas:

34

Você precisa ter certeza de que o projeto autônomo que você está iniciando é iniciado com Python 3. Se você estiver enviando seu programa autônomo por meio de spark-submit, ele deve funcionar bem, mas se você estiver iniciando com python, certifique-se de usar python3 para começar seu aplicativo.

Além disso, certifique-se de definir suas variáveis ​​env em ./conf/spark-env.sh(se não existir, você pode usá-las spark-env.sh.templatecomo base).

Holden
fonte
3
@Kevin - Estou tendo o mesmo problema, por favor, poste sua solução em relação à alteração que você fez em spark-evn.sh.
Dev Patel
1
Essa é a maneira certa de induzir variáveis ​​PATH ao Spark, em vez de modificar .bashrc.
CᴴᴀZ
Por que usar o python 3 requer @Holden?
jerzy
O Spark pode ser executado em python2, mas, neste caso, o usuário estava tentando especificar python3 em sua pergunta. Qualquer que seja a versão do Python, ela precisa ser feita de forma consistente.
Holden
79

Definir PYSPARK_PYTHON=python3e PYSPARK_DRIVER_PYTHON=python3ambos para python3 funciona para mim. Fiz isso usando export no meu .bashrc. No final, estas são as variáveis ​​que crio:

export SPARK_HOME="$HOME/Downloads/spark-1.4.0-bin-hadoop2.4"
export IPYTHON=1
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

Eu também segui este tutorial para fazê-lo funcionar a partir do notebook Ipython3: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/

fccoelho
fonte
5
Há um erro no spark 2.1 relacionado à opção "IPYTHON = 1". A mensagem de erro é "IPYTHON e IPYTHON_OPTS foram removidos do Spark 2.0+. Remova-os do ambiente e defina PYSPARK_DRIVER_PYTHON e PYSPARK_DRIVER_PYTHON_OPTS."
notilas
1
PYSPARK_PYTHON=python3define a versão Python dos trabalhadores, certo?
Joe
Se estiver executando a partir do PyCharm, adicione PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3a Executar> Editar configurações> {your_run_config}> Variáveis ​​de ambiente. Para torná-los o padrão para todas as configurações de execução, atualize as variáveis ​​de ambiente para os modelos desejados em Executar> Editar configurações> Modelos
MisterEd
28

Ajudou no meu caso:

import os

os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"
Nikolay Bystritskiy
fonte
1
isso funciona para mim depois de definir PYSPARK_DRIVER_PYTHON com o mesmo valor com PYSPARK_PYTHON.
buxizhizhoum
12

Você pode especificar a versão do Python para o driver, definindo as variáveis ​​de ambiente apropriadas no ./conf/spark-env.sharquivo. Se ainda não existir, você pode usar o spark-env.sh.templatearquivo fornecido, que também inclui muitas outras variáveis.

Aqui está um exemplo simples de um spark-env.sharquivo para definir as variáveis ​​de ambiente Python relevantes:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
export PYSPARK_PYTHON=/usr/bin/python3       
export PYSPARK_DRIVER_PYTHON=/usr/bin/ipython

Neste caso, ele define a versão do Python usada pelos trabalhadores / executores para Python3 e a versão do driver do Python para iPython para um shell mais agradável para trabalhar.

Se você ainda não tem um spark-env.sharquivo e não precisa definir nenhuma outra variável, este deve fazer o que você quiser, assumindo que os caminhos para os binários Python relevantes estão corretos (verifique com which). Eu tive um problema semelhante e isso resolveu.

James Clarke
fonte
Como executar este arquivo?
Volatil3 de
Tive de renomear spark-env.sh.template para spark-env.sh e adicionar ao final do arquivo export PYSPARK_PYTHON = / usr / local / bin / python3 export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3. Eu tive que descobrir onde meu python3 estava através do qual python3
danivicario
10

Se você estiver executando o Spark em uma organização maior e não conseguir atualizar o arquivo /spark-env.sh, exportar as variáveis ​​de ambiente pode não funcionar.

Você pode adicionar as configurações específicas do Spark por meio da --confopção ao enviar a tarefa em tempo de execução.

pyspark --master yarn --[other settings]\ 
  --conf "spark.pyspark.python=/your/python/loc/bin/python"\ 
  --conf "spark.pyspark.driver.python=/your/python/loc/bin/python"
Phillip Stich
fonte
9

Acabei de enfrentar o mesmo problema e essas são as etapas que sigo para fornecer a versão Python. Eu queria executar meus trabalhos do PySpark com Python 2.7 em vez de 2.6.

  1. Vá para a pasta para onde $SPARK_HOMEestá apontando (no meu caso é /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. Na pasta conf, há um arquivo chamado spark-env.sh. No caso de você ter um arquivo chamado, spark-env.sh.templatevocê precisará copiar o arquivo para um novo arquivo chamado spark-env.sh.

  3. Edite o arquivo e escreva as próximas três linhas

    export PYSPARK_PYTHON = / usr / local / bin / python2.7

    export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python2.7

    export SPARK_YARN_USER_ENV = "PYSPARK_PYTHON = / usr / local / bin / python2.7"

  4. Salve-o e inicie seu aplicativo novamente :)

Dessa forma, se você baixar uma nova versão autônoma do Spark, poderá definir a versão do Python para a qual deseja executar o PySpark.

Selknam
fonte
2
Observe que a recomendação é colocar cpo arquivo spark-env.sh.templatecomo um novo spark-env.she, em seguida, alterar o novo arquivo em vez de alterar o nome e o conteúdo do modelo. O modelo deve permanecer como uma referência.
et_l
@et_l Tem razão, acabei de fazer uma pequena modificação na resposta levando em consideração seu comentário, obrigado!
selknam
5

Encontrei a mesma mensagem de erro e tentei três maneiras mencionadas acima. Listei os resultados como uma referência complementar a outros.

  1. Alterar o valor PYTHON_SPARKe PYTHON_DRIVER_SPARKem spark-env.shnão funciona para mim.
  2. Alterar o valor dentro do script python usando os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"não funciona para mim.
  3. Alterar o valor ~/.bashrcfunciona como um encanto ~
Frank
fonte
seu comentário é ouro puro depois de passar uma hora
Obrigado
Muito obrigado. Testei muitas soluções. O seu funcionou muito bem.
Muser
3

Eu estava executando em IPython (conforme descrito neste link por Jacek Wasilewski ) e estava recebendo essa exceção; Adicionado PYSPARK_PYTHONao arquivo de kernel IPython e usado o notebook jupyter para executar, e começou a trabalhar.

vi  ~/.ipython/kernels/pyspark/kernel.json

{
 "display_name": "pySpark (Spark 1.4.0)",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "IPython.kernel",
  "--profile=pyspark",
  "-f",
  "{connection_file}"
 ],

 "env": {
  "SPARK_HOME": "/usr/local/spark-1.6.1-bin-hadoop2.6/",
  "PYTHONPATH": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/:/usr/local/spark-1
.6.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip",
  "PYTHONSTARTUP": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/pyspark/shell.py
",
  "PYSPARK_SUBMIT_ARGS": "--master spark://127.0.0.1:7077 pyspark-shell",
  "PYSPARK_DRIVER_PYTHON":"ipython2",
   "PYSPARK_PYTHON": "python2"
 }
Alex Punnen
fonte
2

Eu tenho o mesmo problema em faísca autônoma em janelas . Minha versão de correção é assim: eu tinha minhas configurações de variáveis ​​de ambiente como abaixo

PYSPARK_SUBMIT_ARGS="pyspark-shell"
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark

Com essa configuração, executei uma ação no pyspark e obtive a seguinte exceção:

Python in worker has different version 3.6 than that in driver 3.5, PySpark cannot run with different minor versions.
Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

Para verificar com qual versão do Python meu spark-worker está usando, acesse o seguinte no prompt do cmd .

python --version
Python 3.6.3

que me mostrou o Python 3.6.3 . Então, claramente, meu spark-worker está usando sistema python que é v3.6.3.

Agora, enquanto eu defino meu driver spark para executar o jupyter configurando PYSPARK_DRIVER_PYTHON=jupyterentão, preciso verificar a versão do python que o jupyter está usando.

Para fazer isso, abra o prompt do Anaconda e clique

python --version
Python 3.5.X :: Anaconda, Inc.

Aqui tem o python jupyter está usando a v3.5.x . Você pode verificar esta versão também em qualquer Notebook (Ajuda-> Sobre).

Agora preciso atualizar o jupyter python para a versão v3.6.6 . Para fazer isso, abra o prompt do Anaconda e clique

conda search python

Isso lhe dará uma lista de versões de python disponíveis no Anaconda. Instale o seu desejado com

conda install python = 3.6.3

Agora eu tenho ambas as instalações do Python da mesma versão 3.6.3. O Spark não deveria estar em conformidade e não estava quando executei uma Ação no driver do Spark. A exceção acabou. Boa codificação ...

Rizvi Hasan
fonte
1

Caso você deseje apenas alterar a versão do python para a tarefa atual, você pode usar o seguinte comando pyspark start:

    PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..
Peter Pan
fonte
1

Por favor, olhe o snippet abaixo:

#setting environment variable for pyspark in linux||ubuntu
#goto --- /usr/local/spark/conf
#create a new file named spark-env.sh copy all content of spark-env.sh.template to it
#then add below lines to it, with path to python

PYSPARK_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser"
#i was running python 3.6 ||run - 'which python' in terminal to find the path of python
Justin Varughese
fonte
Por favor, verifique os modelos antes de postar.
Deepesh Rehi
0

Estou usando o seguinte ambiente

? python --version; ipython --version; jupyter --version
Python 3.5.2+
5.3.0
5.0.0

e os seguintes aliases funcionam bem para mim

alias pyspark="PYSPARK_PYTHON=/usr/local/bin/python3 PYSPARK_DRIVER_PYTHON=ipython ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"    
alias pysparknotebook="PYSPARK_PYTHON=/usr/bin/python3 PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS='notebook' ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"

No notebook, eu configurei o ambiente da seguinte maneira

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()
George Fisher
fonte
0

Erro

"Exceção: o Python no trabalhador tem uma versão 2.6 diferente do driver 2.7, o PySpark não pode ser executado com versões secundárias diferentes". 

Correção (para ambiente Cloudera)

  • Edite este arquivo: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • Adicione estas linhas:

    export PYSPARK_PYTHON=/usr/bin/python
    export PYSPARK_DRIVER_PYTHON=python
    
William Lee
fonte
0

Encontrei isso hoje no trabalho. Um administrador achou prudente codificar o Python 2.7 como o PYSPARK_PYTHONe PYSPARK_DRIVER_PYTHONem $SPARK_HOME/conf/spark-env.sh. Desnecessário dizer que isso quebrou todos os nossos trabalhos que utilizam qualquer outra versão ou ambiente python (que é> 90% dos nossos trabalhos). @PhillipStich aponta corretamente que você nem sempre tem permissão de gravação para este arquivo, como é o nosso caso. Embora definir a configuração na spark-submitchamada seja uma opção, outra alternativa (ao executar no modo yarn / cluster) é definir a SPARK_CONF_DIRvariável de ambiente para apontar para outro script de configuração. Lá você pode definir seu PYSPARK_PYTHON e quaisquer outras opções de que possa precisar. Um modelo pode ser encontrado no código-fonte spark-env.sh no github .

Grr
fonte
0

No meu caso (Ubuntu 18.04), executei este código no terminal:

sudo vim ~/.bashrc

e editado da SPARK_HOMEseguinte forma:

export SPARK_HOME=/home/muser/programs/anaconda2019/lib/python3.7/site-packages/pyspark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

Ao fazer isso, SPARK_HOMEvou me referir ao pysparkpacote que instalei no site-package.

Para saber como usar vim, acesse este link.

Muser
fonte
0

Corre:

ls -l /usr/local/bin/python*

A primeira linha neste exemplo mostra o link simbólico python3. Para defini-lo como o link simbólico padrão do Python, execute o seguinte:

ln -s -f /usr/local/bin/python3 /usr/local/bin/python

em seguida, recarregue seu shell.

Hillary Murefu
fonte
0

Tive o mesmo problema, só esqueci de ativar meu ambiente virtual. Para qualquer um que também tenha um branco mental.

chadmc
fonte
0

Se você estiver trabalhando no mac, use os seguintes comandos

export SPARK_HOME=`brew info apache-spark | grep /usr | tail -n 1 | cut -f 1 -d " "`/libexec
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH

export HADOOP_HOME=`brew info hadoop | grep /usr | head -n 1 | cut -f 1 -d " "`/libexec
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/:$LD_LIBRARY_PATH
export PYSPARK_PYTHON=python3

Se você estiver usando outro sistema operacional, verifique o seguinte link: https://github.com/GalvanizeDataScience/spark-install

Joao José
fonte