Comment définir la version python du pilote dans Spark?


87

J'utilise spark 1.4.0-rc2 pour pouvoir utiliser python 3 avec spark. Si j'ajoute export PYSPARK_PYTHON=python3à mon fichier .bashrc, je peux exécuter spark de manière interactive avec python 3. Cependant, si je veux exécuter un programme autonome en mode local, j'obtiens une erreur:

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

Comment puis-je spécifier la version de python pour le pilote? Le réglage export PYSPARK_DRIVER_PYTHON=python3n'a pas fonctionné.

Réponses:


34

Vous devez vous assurer que le projet autonome que vous lancez est lancé avec Python 3. Si vous soumettez votre programme autonome via spark-submit, cela devrait fonctionner correctement, mais si vous le lancez avec python, assurez-vous d'utiliser python3 pour démarrer votre appli.

Assurez-vous également d'avoir défini vos variables d'environnement dans ./conf/spark-env.sh(s'il n'existe pas, vous pouvez l'utiliser spark-env.sh.templatecomme base.)


3
@Kevin - J'ai le même problème, pourriez-vous s'il vous plaît poster votre solution concernant le changement que vous avez fait dans spark-evn.sh.
Dev Patel

1
C'est la bonne façon d'induire des variables PATH à Spark, au lieu de les modifier .bashrc.
CᴴᴀZ

Pourquoi l'utilisation de python 3 est-elle requise @Holden?
jerzy

Spark peut s'exécuter en python2, mais dans ce cas, l'utilisateur essayait de spécifier python3 dans sa question. Quelle que soit la version de Python, elle doit être effectuée de manière cohérente.
Holden

79

La configuration PYSPARK_PYTHON=python3et les PYSPARK_DRIVER_PYTHON=python3deux vers python3 fonctionnent pour moi. Je l'ai fait en utilisant l'exportation dans mon .bashrc. Au final, ce sont les variables que je crée:

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"

J'ai également suivi ce tutoriel pour le faire fonctionner à partir du notebook Ipython3: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/


5
Il y a une erreur sur spark 2.1 liée à l'option "IPYTHON = 1". Le message d'erreur est "IPYTHON et IPYTHON_OPTS sont supprimés dans Spark 2.0+. Supprimez-les de l'environnement et définissez PYSPARK_DRIVER_PYTHON et PYSPARK_DRIVER_PYTHON_OPTS à la place."
notilas

1
PYSPARK_PYTHON=python3définit la version Python des workers, non?
Joe

Si vous exécutez depuis PyCharm, ajoutez PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3à Exécuter> Modifier les configurations> {your_run_config}> Variables d'environnement. Pour en faire la valeur par défaut pour toutes les configurations d'exécution, mettez à jour les variables d'environnement pour le (s) modèle (s) souhaité (s) sous Exécuter> Modifier les configurations> Modèles
MisterEd

28

Aidé dans mon cas:

import os

os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"

1
cela fonctionne pour moi après avoir défini PYSPARK_DRIVER_PYTHON à la même valeur avec PYSPARK_PYTHON.
buxizhizhoum

12

Vous pouvez spécifier la version de Python pour le pilote en définissant les variables d'environnement appropriées dans le ./conf/spark-env.shfichier. S'il n'existe pas déjà, vous pouvez utiliser lespark-env.sh.template fichier fourni qui comprend également de nombreuses autres variables.

Voici un exemple simple de spark-env.shfichier pour définir les variables d'environnement Python pertinentes:

#!/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

Dans ce cas, il définit la version de Python utilisée par les travailleurs / exécuteurs sur Python3 et la version du pilote de Python sur iPython pour un shell plus agréable à utiliser.

Si vous n'avez pas encore de spark-env.shfichier et que vous n'avez pas besoin de définir d'autres variables, celui-ci devrait faire ce que vous voulez, en supposant que les chemins vers les binaires python pertinents sont corrects (vérifiez avec which). J'ai eu un problème similaire et cela l'a résolu.


Comment exécuter ce fichier?
Volatil3

J'ai dû renommer spark-env.sh.template en spark-env.sh puis ajouter à la queue du fichier export PYSPARK_PYTHON = / usr / local / bin / python3 export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3. Je devais savoir où était mon python3 via quel python3
danivicario

10

Si vous exécutez Spark dans une organisation plus grande et que vous ne parvenez pas à mettre à jour le fichier /spark-env.sh, l'exportation des variables d'environnement peut ne pas fonctionner.

Vous pouvez ajouter les paramètres Spark spécifiques via l' --confoption lors de la soumission du travail au moment de l'exécution.

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

9

Je viens de faire face au même problème et ce sont les étapes que je suis pour fournir la version Python. Je voulais exécuter mes travaux PySpark avec Python 2.7 au lieu de 2.6.

  1. Allez dans le dossier où $SPARK_HOMEpointe (dans mon cas est /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. Sous le dossier conf, il y a un fichier appelé spark-env.sh. Si vous avez un fichier appelé, spark-env.sh.templatevous devrez copier le fichier dans un nouveau fichier appelé spark-env.sh.

  3. Modifiez le fichier et écrivez les trois lignes suivantes

    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. Enregistrez-le et relancez votre application :)

De cette façon, si vous téléchargez une nouvelle version autonome de Spark, vous pouvez définir la version Python sur laquelle vous souhaitez exécuter PySpark.


2
Notez que la recommandation est de cpplacer le fichier spark-env.sh.templatecomme nouveau spark-env.sh, puis de modifier le nouveau fichier plutôt que de changer le nom et le contenu du modèle. Le modèle est censé rester une référence.
et_l

@et_l Vous avez raison, je viens de faire une petite modification à la réponse en tenant compte de votre commentaire, merci!
selknam

5

Je suis tombé sur le même message d'erreur et j'ai essayé trois méthodes mentionnées ci-dessus. J'ai énuméré les résultats comme une référence complémentaire aux autres.

  1. Changer la valeur PYTHON_SPARKet PYTHON_DRIVER_SPARKdans spark-env.shne fonctionne pas pour moi.
  2. Changer la valeur dans le script python en utilisant os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"ne fonctionne pas pour moi.
  3. Changer la valeur des ~/.bashrcœuvres comme un charme ~

votre commentaire est de l'or pur après avoir passé une heure.Merci
cheapcoder

Merci beaucoup. J'ai testé beaucoup de solutions. Le vôtre a très bien fonctionné.
Muser

3

Je l'exécutais en IPython (comme décrit dans ce lien par Jacek Wasilewski ) et recevais cette exception; Ajouté PYSPARK_PYTHONau fichier du noyau IPython et utilisé le notebook jupyter pour s'exécuter, et a commencé à travailler.

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"
 }

2

J'ai eu le même problème sur l' étincelle autonome dans Windows . Ma version de correctif est comme ceci: j'avais mes variables d'environnement définies comme ci-dessous

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

Avec ce paramètre, j'ai exécuté une action sur pyspark et j'ai obtenu l'exception suivante:

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.

Pour vérifier avec quelle version de Python mon Spark-worker utilise, cliquez sur ce qui suit dans l' invite cmd .

python --version
Python 3.6.3

qui m'a montré Python 3.6.3 . Si clairement mon étinceleur utilise le système python qui est la v3.6.3.

Maintenant que je configure mon pilote spark pour exécuter jupyter en définissant PYSPARK_DRIVER_PYTHON=jupyter, je dois donc vérifier la version de python que jupyter utilise.

Pour ce faire, ouvrez l' invite Anaconda et appuyez sur

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

Voici le jupyter python utilise le v3.5.x . Vous pouvez vérifier cette version également dans n'importe quel notebook (Aide-> À propos).

Maintenant, je dois mettre à jour le jupyter python vers la version v3.6.6 . Pour ce faire, ouvrez l' invite Anaconda et appuyez sur

recherche conda python

Cela vous donnera une liste des versions de python disponibles dans Anaconda. Installez celui que vous souhaitez avec

conda installer python = 3.6.3

Maintenant, j'ai à la fois l'installation de Python de la même version 3.6.3 Spark ne devrait pas être conforme et ce n'était pas le cas lorsque j'ai exécuté une action sur le pilote Spark. L'exception est partie. Bon codage ...


1

Si vous souhaitez uniquement modifier la version de python pour la tâche en cours, vous pouvez utiliser la commande pyspark start suivante:

    PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..

1

Veuillez consulter l'extrait ci-dessous:

#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

Veuillez vérifier les modèles avant de publier.
Deepesh Rehi

0

J'utilise l'environnement suivant

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

et les alias suivants fonctionnent bien pour moi

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"

Dans le cahier, je configure l'environnement comme suit

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()

0

Erreur

"Exception: Python dans le worker a une version 2.6 différente de celle du pilote 2.7, PySpark ne peut pas fonctionner avec différentes versions mineures". 

Correction (pour l'environnement Cloudera)

  • Modifiez ce fichier: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • Ajoutez ces lignes:

    export PYSPARK_PYTHON=/usr/bin/python
    export PYSPARK_DRIVER_PYTHON=python
    

0

Ran dans ce aujourd'hui au travail. Un administrateur a jugé prudent de coder en dur Python 2.7 en tant que PYSPARK_PYTHONet PYSPARK_DRIVER_PYTHONdans $SPARK_HOME/conf/spark-env.sh. Inutile de dire que cela a cassé tous nos emplois qui utilisent d'autres versions ou environnements de Python (ce qui représente> 90% de nos emplois). @PhillipStich souligne à juste titre que vous ne disposez pas toujours des autorisations d'écriture pour ce fichier, comme c'est notre cas. Bien que la définition de la configuration dans l' spark-submitappel soit une option, une autre alternative (lors de l'exécution en mode fil / cluster) consiste à définir la SPARK_CONF_DIRvariable d'environnement pour qu'elle pointe vers un autre script de configuration. Là, vous pouvez définir votre PYSPARK_PYTHON et toutes les autres options dont vous pourriez avoir besoin. Un modèle peut être trouvé dans le code source de spark-env.sh sur github .


0

Dans mon cas (Ubuntu 18.04), j'ai exécuté ce code dans le terminal:

sudo vim ~/.bashrc

puis édité SPARK_HOMEcomme suit:

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

Ce faisant, je SPARK_HOMEferai référence au pysparkpackage que j'ai installé dans lesite-package .

Pour savoir comment l'utiliser vim, accédez à ce lien.


0

Courir:

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

La première ligne de cet exemple montre le lien symbolique python3. Pour le définir comme lien symbolique python par défaut, exécutez ce qui suit:

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

puis rechargez votre shell.


0

J'ai eu le même problème, j'ai juste oublié d'activer mon environnement virtuel. Pour tous ceux qui avaient aussi un vide mental.


0

Si vous travaillez sous mac, utilisez les commandes suivantes

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

Si vous utilisez un autre système d'exploitation, consultez le lien suivant: https://github.com/GalvanizeDataScience/spark-install

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.