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. Toutefois, si je souhaite 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? La définition de export PYSPARK_DRIVER_PYTHON=python3
n'a pas fonctionné.
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 de bien utiliser python3 votre application.
Assurez-vous également que vous avez défini vos variables env dans ./conf/spark-env.sh
(si elles n'existent pas, vous pouvez utiliser spark-env.sh.template
comme base.)
Régler PYSPARK_PYTHON=python3
et PYSPARK_DRIVER_PYTHON=python3
tous les deux sur python3 fonctionne pour moi. Je l'ai fait en utilisant export dans mon .bashrc. En fin de compte, 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 cahier Ipython3: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/
A 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"
Vous pouvez spécifier la version de Python pour le pilote en définissant les variables d'environnement appropriées dans le fichier ./conf/spark-env.sh
. S'il n'existe pas déjà, vous pouvez utiliser le fichier spark-env.sh.template
fourni, qui inclut également de nombreuses autres variables.
Voici un exemple simple de fichier spark-env.sh
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 opérateurs/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 déjà un fichier spark-env.sh
et n'avez pas besoin de définir d'autres variables, celle-ci doit faire ce que vous voulez, en supposant que les chemins d'accès aux fichiers binaires python pertinents sont corrects (vérifiez avec which
). J'ai eu un problème similaire et cela a résolu le problème.
Je viens de faire face au même problème et voici les étapes que je suis en train de suivre pour fournir la version Python. Je voulais exécuter mes tâches PySpark avec Python 2.7 au lieu de 2.6.
Allez dans le dossier où pointe $SPARK_HOME
(dans mon cas, c'est /home/cloudera/spark-2.1.0-bin-hadoop2.7/
)
Sous le dossier conf
, il existe un fichier appelé spark-env.sh
. Si vous avez un fichier appelé spark-env.sh.template
, vous devrez le copier dans un nouveau fichier appelé spark-env.sh
.
Editez 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"
Enregistrez-le et relancez votre application :)
Ainsi, si vous téléchargez une nouvelle version autonome de Spark, vous pouvez définir la version de Python sur laquelle vous souhaitez exécuter PySpark.
Je l’utilisais sous IPython (comme décrit dans ce link par Jacek Wasilewski ) et je recevais cette exception; Ajout de PYSPARK_PYTHON
au fichier de noyau IPython et utilisation du cahier de notes jupyter, puis mise en marche.
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"
}
Si vous exécutez Spark dans une organisation plus grande et que vous ne pouvez pas mettre à jour le fichier /spark-env.sh, l'exportation des variables d'environnement risque de ne pas fonctionner.
Vous pouvez ajouter les paramètres Spark spécifiques via l'option --conf
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"
Je suis tombé sur le même message d'erreur et j'ai essayé trois manières mentionnées ci-dessus. J'ai énuméré les résultats comme une référence complémentaire aux autres.
PYTHON_SPARK
et PYTHON_DRIVER_SPARK
dans spark-env.sh
ne fonctionne pas pour moi.os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5"
os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"
ne fonctionne pas pour moi.~/.bashrc
fonctionne comme un charme ~J'ai le même problème sur standalone spark in windows . Ma version de correctif est la suivante:
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 python mon spark-worker utilise, tapez ce qui suit dans l'invite cmd.
python --version
Python 3.6.3
qui m'a montré Python 3.6.3. Il est donc clair que mon spark-worker utilise python système, la v3.6.3.
Maintenant que je configure mon spark-driver pour exécuter jupyter en définissant PYSPARK_DRIVER_PYTHON=jupyter
, je dois donc vérifier la version python utilisée par jupyter.
Pour ce faire, ouvrez Anaconda Prompt et appuyez sur
python --version
Python 3.5.X :: Anaconda, Inc.
Ici, le python jupyter utilise le fichier v3.5.x. Vous pouvez également vérifier cette version dans n’importe quel bloc-notes (Aide-> À propos de).
Maintenant, je dois mettre à jour le python Jupyter vers la version v3.6.6. Pour ce faire, ouvrez l'invite Anaconda et appuyez sur
recherche python
Cela vous donnera une liste des versions disponibles de python dans Anaconda. Installez votre désiré avec
conda install python = 3.6.3
Maintenant, les deux installations Python de la même version 3.6.3 ne devraient pas être conformes à Spark. L'exception est parti. Joyeux codage ...
Couru dans ce aujourd'hui au travail. Un administrateur a jugé prudent de coder en dur Python 2.7 en tant que PYSPARK_PYTHON
et PYSPARK_DRIVER_PYTHON
dans $SPARK_HOME/conf/spark-env.sh
. Inutile de dire que cela a cassé tous nos travaux utilisant toutes les versions ou environnements Python (ce qui représente> 90% de nos travaux). @PhillipStich souligne correctement que vous ne pouvez pas toujours avoir les autorisations d'écriture pour ce fichier, comme c'est notre cas. Lorsque la configuration dans l'appel spark-submit
est une option, une autre possibilité (lors de l'exécution en mode fil/cluster) consiste à définir la variable d'environnement SPARK_CONF_DIR
pour qu'elle pointe vers un autre script de configuration. Vous pouvez y définir votre PYSPARK_PYTHON et toute autre option dont vous pourriez avoir besoin. Un modèle peut être trouvé dans le code source spark-env.sh sur github .
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()
Si vous souhaitez uniquement modifier la version de python pour la tâche en cours, vous pouvez utiliser la commande suivante pyspark start
PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..
"Exception: Python dans worker a une version 2.6 différente de celle du pilote 2.7, PySpark ne peut pas fonctionner avec différentes versions mineures".
Éditez 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