Wie setze ich die Python-Version des Treibers auf Funken?

86

Ich verwende Spark 1.4.0-rc2, damit ich Python 3 mit Spark verwenden kann. Wenn ich export PYSPARK_PYTHON=python3meiner .bashrc-Datei hinzufüge , kann ich spark interaktiv mit Python 3 ausführen. Wenn ich jedoch ein eigenständiges Programm im lokalen Modus ausführen möchte, wird folgende Fehlermeldung angezeigt:

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

Wie kann ich die Python-Version für den Treiber angeben? Die Einstellung export PYSPARK_DRIVER_PYTHON=python3hat nicht funktioniert.

Kevin
quelle

Antworten:

34

Sie müssen sicherstellen, dass das eigenständige Projekt, das Sie starten, mit Python 3 gestartet wird. Wenn Sie Ihr eigenständiges Programm über Spark-Submit senden, sollte es einwandfrei funktionieren. Wenn Sie es jedoch mit Python starten, stellen Sie sicher, dass Sie Python3 zum Starten verwenden Ihre App.

Stellen Sie außerdem sicher, dass Sie Ihre env-Variablen festgelegt haben ./conf/spark-env.sh(falls diese nicht vorhanden sind, können Sie sie spark-env.sh.templateals Basis verwenden.)

gehalten
quelle
3
@ Kevin - Ich habe das gleiche Problem. Könnten Sie bitte Ihre Lösung bezüglich der Änderung, die Sie in spark-evn.sh vorgenommen haben, veröffentlichen?
Dev Patel
1
Dies ist der richtige Weg, um PATH-Variablen in Spark zu induzieren, anstatt sie zu ändern .bashrc.
CᴴᴀZ
Warum ist die Verwendung von Python 3 @Holden erforderlich?
Jerzy
Spark kann in Python2 ausgeführt werden. In diesem Fall hat der Benutzer jedoch versucht, Python3 in seiner Frage anzugeben. Unabhängig davon, um welche Python-Version es sich handelt, muss dies konsistent erfolgen.
Holden
79

Das Einstellen PYSPARK_PYTHON=python3und PYSPARK_DRIVER_PYTHON=python3beides auf python3 funktioniert bei mir. Ich habe dies mit Export in meiner .bashrc gemacht. Am Ende sind dies die Variablen, die ich erstelle:

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"

Ich habe auch dieses Tutorial befolgt, damit es in Ipython3 funktioniert: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/

fccoelho
quelle
5
Bei Funke 2.1 ist ein Fehler im Zusammenhang mit der Option "IPYTHON = 1" aufgetreten. Die Fehlermeldung lautet "IPYTHON und IPYTHON_OPTS werden in Spark 2.0+ entfernt. Entfernen Sie diese aus der Umgebung und setzen Sie stattdessen PYSPARK_DRIVER_PYTHON und PYSPARK_DRIVER_PYTHON_OPTS."
Notilas
1
PYSPARK_PYTHON=python3legt die Python-Version der Worker fest, oder?
Joe
Wenn Sie von PyCharm aus ausführen, fügen Sie PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3zu Ausführen> Konfigurationen bearbeiten> {your_run_config}> Umgebungsvariablen hinzu. Um diese als Standard für alle Ausführungskonfigurationen festzulegen, aktualisieren Sie die Umgebungsvariablen für die gewünschten Vorlagen unter Ausführen> Konfigurationen bearbeiten> Vorlagen
MisterEd
28

Hat in meinem Fall geholfen:

import os

os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"
Nikolay Bystritskiy
quelle
1
Dies funktioniert bei mir, nachdem PYSPARK_DRIVER_PYTHON mit PYSPARK_PYTHON auf den gleichen Wert gesetzt wurde.
Buxizhizhoum
12

Sie können die Version von Python für den Treiber angeben, indem Sie die entsprechenden Umgebungsvariablen in der ./conf/spark-env.shDatei festlegen . Wenn es noch nicht vorhanden ist, können Sie die spark-env.sh.templatebereitgestellte Datei verwenden, die auch viele andere Variablen enthält.

Hier ist ein einfaches Beispiel für eine spark-env.shDatei zum Festlegen der relevanten Python-Umgebungsvariablen:

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

In diesem Fall wird die von den Workern / Executoren verwendete Python-Version auf Python3 und die Treiberversion von Python auf iPython gesetzt, damit eine schönere Shell funktioniert.

Wenn Sie noch keine spark-env.shDatei haben und keine anderen Variablen festlegen müssen, sollte diese das tun, was Sie wollen, vorausgesetzt, die Pfade zu den relevanten Python-Binärdateien sind korrekt (überprüfen Sie mit which). Ich hatte ein ähnliches Problem und das hat es behoben.

James Clarke
quelle
Wie führe ich diese Datei aus?
Volatil3
Ich musste spark-env.sh.template in spark-env.sh umbenennen und dann zum Ende des Dateiexports hinzufügen PYSPARK_PYTHON = / usr / local / bin / python3 export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3. Ich musste herausfinden, wo mein Python3 war, über welchen Python3
Danivicario
10

Wenn Sie Spark in einer größeren Organisation ausführen und die Datei /spark-env.sh nicht aktualisieren können, funktioniert das Exportieren der Umgebungsvariablen möglicherweise nicht.

Sie können die spezifischen Spark-Einstellungen über die --confOption hinzufügen, wenn Sie den Job zur Laufzeit senden.

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
quelle
9

Ich hatte gerade das gleiche Problem und dies sind die Schritte, die ich befolge, um die Python-Version bereitzustellen. Ich wollte meine PySpark-Jobs mit Python 2.7 anstelle von 2.6 ausführen.

  1. Gehen Sie zu dem Ordner, auf den verwiesen $SPARK_HOMEwird (in meinem Fall /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. Unter Ordner confbefindet sich eine Datei mit dem Namen spark-env.sh. Wenn Sie eine Datei mit dem Namen haben, müssen spark-env.sh.templateSie die Datei in eine neue Datei mit dem Namen kopieren spark-env.sh.

  3. Bearbeiten Sie die Datei und schreiben Sie die nächsten drei Zeilen

    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. Speichern Sie es und starten Sie Ihre Anwendung erneut :)

Auf diese Weise können Sie beim Herunterladen einer neuen eigenständigen Spark-Version die Python-Version festlegen, auf der PySpark ausgeführt werden soll.

Selknam
quelle
2
Beachten Sie, dass empfohlen wird, cpdie Datei spark-env.sh.templateals neue Datei zu verwenden spark-env.shund dann die neue Datei zu ändern, anstatt den Namen und den Inhalt der Vorlage zu ändern. Die Vorlage soll als Referenz bleiben.
et_l
@et_l Du hast recht, ich habe nur eine kleine Änderung an der Antwort vorgenommen, wobei dein Kommentar berücksichtigt wurde, danke!
Selknam
5

Ich bin auf dieselbe Fehlermeldung gestoßen und habe drei oben erwähnte Möglichkeiten ausprobiert. Ich habe die Ergebnisse als ergänzende Referenz zu anderen aufgeführt.

  1. Ändern Sie den PYTHON_SPARKund PYTHON_DRIVER_SPARKWert in spark-env.shfunktioniert bei mir nicht.
  2. Das Ändern des Werts im Python-Skript mit os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"funktioniert bei mir nicht.
  3. Ändern Sie den Wert in ~/.bashrcfunktioniert wie ein Zauber ~
Frank
quelle
Ihr Kommentar ist reines Gold, nachdem Sie eine Stunde verbracht haben. Danke
billiger Kodierer
Vielen Dank. Ich habe viele Lösungen getestet. Ihre hat sehr gut funktioniert.
Muser
3

Ich habe es in IPython ausgeführt (wie in diesem Link von Jacek Wasilewski beschrieben ) und diese Ausnahme erhalten. Hinzugefügt PYSPARK_PYTHONzum IPython Kernel - Datei und gebrauchten jupyter Notebook laufen und zu arbeiten begann.

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

Ich habe das gleiche Problem mit Standalone-Funken in Fenstern . Meine Version von fix sieht folgendermaßen aus: Ich hatte meine Umgebungsvariablen wie folgt eingestellt

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

Mit dieser Einstellung habe ich eine Aktion auf pyspark ausgeführt und die folgende Ausnahme erhalten:

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.

Um zu überprüfen, mit welcher Python-Version mein Spark-Worker verwendet, klicken Sie in der cmd- Eingabeaufforderung auf Folgendes .

python --version
Python 3.6.3

das zeigte mir Python 3.6.3 . Mein Spark-Worker verwendet also eindeutig Systempython v3.6.3.

Jetzt, da ich meinen Spark-TreiberPYSPARK_DRIVER_PYTHON=jupyter so eingestellt habe, dass er Jupiter durch Ausführen ausführt , muss ich überprüfen, welche Python-Version Jupiter verwendet.

Öffnen Sie dazu die Anaconda-Eingabeaufforderung und klicken Sie auf

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

Hier hat der Jupyter Python die v3.5.x verwendet . Sie können diese Version auch in jedem Notebook überprüfen (Hilfe-> Info).

Jetzt muss ich die Jupiter-Python auf die Version v3.6.6 aktualisieren . Öffnen Sie dazu die Anaconda-Eingabeaufforderung und drücken Sie

Conda Suche Python

Dadurch erhalten Sie eine Liste der verfügbaren Python-Versionen in Anaconda. Installieren Sie Ihre gewünschte mit

conda install python = 3.6.3

Jetzt habe ich beide Python-Installationen der gleichen Version 3.6.3 Spark sollte nicht konform sein und es nicht, als ich eine Aktion auf Spark-Treiber ausgeführt habe. Ausnahme ist weg. Viel Spaß beim Codieren ...

Rizvi Hasan
quelle
1

Wenn Sie nur die Python-Version für die aktuelle Aufgabe ändern möchten, können Sie den folgenden Befehl pyspark start verwenden:

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

Bitte schauen Sie sich den folgenden Ausschnitt an:

#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
quelle
Bitte überprüfen Sie die Vorlagen vor dem Posten.
Deepesh Rehi
0

Ich benutze die folgende Umgebung

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

und die folgenden Aliase funktionieren gut für mich

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"

Im Notizbuch habe ich die Umgebung wie folgt eingerichtet

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

Error

"Ausnahme: Python in Worker hat eine andere Version 2.6 als Python 2.7. PySpark kann nicht mit anderen Nebenversionen ausgeführt werden." 

Fix (für Cloudera-Umgebung)

  • Bearbeiten Sie diese Datei: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • Fügen Sie diese Zeilen hinzu:

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

Bin heute bei der Arbeit darauf gestoßen. Ein Administrator hielt es für ratsam, Python 2.7 als PYSPARK_PYTHONund PYSPARK_DRIVER_PYTHONin fest zu codieren $SPARK_HOME/conf/spark-env.sh. Unnötig zu erwähnen, dass dadurch alle unsere Jobs unterbrochen wurden, die andere Python-Versionen oder -Umgebungen verwenden (das sind> 90% unserer Jobs). @PhillipStich weist richtig darauf hin, dass Sie möglicherweise nicht immer über Schreibberechtigungen für diese Datei verfügen, wie dies in unserem Fall der Fall ist. Während das Festlegen der Konfiguration im spark-submitAufruf eine Option ist, besteht eine andere Alternative (im Garn- / Cluster-Modus) darin, die SPARK_CONF_DIRUmgebungsvariable so einzustellen , dass sie auf ein anderes Konfigurationsskript verweist. Dort können Sie Ihren PYSPARK_PYTHON und alle anderen Optionen festlegen, die Sie möglicherweise benötigen. Eine Vorlage finden Sie im Quellcode von spark-env.sh auf github .

Grr
quelle
0

In meinem Fall (Ubuntu 18.04) habe ich diesen Code im Terminal ausgeführt:

sudo vim ~/.bashrc

und dann SPARK_HOMEwie folgt bearbeitet :

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

Auf diese Weise SPARK_HOMEverweise ich auf das pysparkPaket, das ich im installiert habe site-package.

Um zu erfahren, wie man es benutzt vim, gehen Sie zu diesem Link.

Muser
quelle
0

Lauf:

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

Die erste Zeile in diesem Beispiel zeigt den Python3-Symlink. Führen Sie Folgendes aus, um es als Standard-Python-Symlink festzulegen:

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

Laden Sie dann Ihre Shell neu.

Hillary Murefu
quelle
0

Ich hatte das gleiche Problem und habe nur vergessen, meine virtuelle Umgebung zu aktivieren. Für alle da draußen, die auch eine mentale Lücke hatten.

chadmc
quelle
0

Wenn Sie auf einem Mac arbeiten, verwenden Sie die folgenden Befehle

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

Wenn Sie ein anderes Betriebssystem verwenden, überprüfen Sie den folgenden Link: https://github.com/GalvanizeDataScience/spark-install

Juan Jose
quelle