web-dev-qa-db-fra.com

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

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é.

61
Kevin

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.)

24
Holden

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/

59
fccoelho

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

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.

8
James Clarke

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. 

  1. Allez dans le dossier où pointe $SPARK_HOME (dans mon cas, c'est /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. 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.

  3. 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"

  4. 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.  

5
dbustosp

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"
 }
2
Alex Punnen

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"
2
Phillip Stich

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.

  1. Changer les valeurs PYTHON_SPARK et PYTHON_DRIVER_SPARK dans spark-env.sh ne 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 dans ~/.bashrc fonctionne comme un charme ~
0
Frank

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 ...

0
Rizvi Hasan

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 .

0
Grr

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
George Fisher

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 ..
0
Peter Pan

Erreur

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

Fix (pour l'environnement Cloudera)

  • É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
    
0
William Lee