Pyspark in Python-Shell importieren


111

Dies ist eine Kopie der Frage eines anderen in einem anderen Forum, die nie beantwortet wurde. Daher dachte ich, ich würde sie hier erneut stellen, da ich das gleiche Problem habe. (Siehe http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

Ich habe Spark ordnungsgemäß auf meinem Computer installiert und kann Python-Programme mit den pyspark-Modulen fehlerfrei ausführen, wenn ich ./bin/pyspark als meinen Python-Interpreter verwende.

Wenn ich jedoch versuche, die reguläre Python-Shell auszuführen und pyspark-Module zu importieren, wird folgende Fehlermeldung angezeigt:

from pyspark import SparkContext

und es heißt

"No module named pyspark".

Wie kann ich das beheben? Gibt es eine Umgebungsvariable, die ich festlegen muss, um Python auf die pyspark-Header / Bibliotheken / etc. Zu verweisen? Wenn meine Funkeninstallation / spark / ist, welche Pyspark-Pfade muss ich einschließen? Oder können Pyspark-Programme nur vom Pyspark-Interpreter ausgeführt werden?


Sie sagen, dass das Ändern der Umgebungsvariablen "nicht sehr effektiv ist, da es sehr schnell von bin / spark-submit überschrieben wird". Vielleicht können Sie etwas aus diesem Austausch lernen
Emmagras

Antworten:


97

Hier ist eine einfache Methode (Wenn Sie sich nicht darum kümmern, wie es funktioniert !!!)

Verwenden Sie findspark

  1. Gehen Sie zu Ihrer Python-Shell

    pip install findspark
    
    import findspark
    findspark.init()
    
  2. Importieren Sie die erforderlichen Module

    from pyspark import SparkContext
    from pyspark import SparkConf
    
  3. Getan!!!


Die anderen Lösungen haben bei mir nicht funktioniert. Ich verwende Findspark derzeit in meinem Programm. Scheint eine anständige Lösung für das Problem zu sein.
Analytical Monk

Ich würde das lieber nicht tun müssen ... aber hey ... da nichts anderes funktioniert ... nehme ich es.
Javadba

51

Wenn ein solcher Fehler ausgegeben wird:

ImportError: Kein Modul mit dem Namen py4j.java_gateway

Bitte fügen Sie $ SPARK_HOME / python / build zu PYTHONPATH hinzu:

export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

9
Wie in einer anderen Antwort beschrieben, musste stackoverflow.com/questions/26533169/… den folgenden Export hinzufügen: PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson

46

Es stellt sich heraus, dass der pyspark bin Python lädt und automatisch die richtigen Bibliothekspfade lädt. Schauen Sie sich $ SPARK_HOME / bin / pyspark an:

# Add the PySpark classes to the Python path:
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH

Ich habe diese Zeile zu meiner .bashrc-Datei hinzugefügt und die Module wurden nun korrekt gefunden!


1
Zusätzlich zu diesem Schritt musste ich hinzufügen : export SPARK_HOME=~/dev/spark-1.1.0, go figure. Ihre Ordnernamen können variieren.
Emmagras

21

Führen Sie Ihre py-Datei nicht wie folgt aus: python filename.py Verwenden Sie stattdessen:spark-submit filename.py


Kann jemand erläutern, warum dies nicht der Fall ist? Ich habe mich mit dieser Frage befasst, konnte aber bisher keine finden, die erklären, warum das so ist.
Münze

@Mint Die anderen Antworten zeigen warum; Das pyspark-Paket ist standardmäßig nicht im $ PYTHONPATH enthalten, daher schlägt ein import pysparkBefehl in der Befehlszeile oder in einem ausgeführten Skript fehl. Sie müssen entweder a. Führen Sie pyspark wie vorgesehen durch spark-submit aus oder b. Fügen Sie $ SPARK_HOME / python zu $ ​​PYTHONPATH hinzu.
Kingledion

Ein weiterer Punkt ist spark-submit ist ein Shell-Skript, mit dem Sie die Systemumgebung vor der Verwendung von spark korrekt konfigurieren können. Wenn Sie nur python main.py ausführen, müssen Sie die Systemumgebung korrekt konfigurieren, z. B. PYTHONPATH, SPARK_HOME
E.ZY.

21

Durch den Export des SPARK-Pfads und des Py4j-Pfads begann es zu funktionieren:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.5.1
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH 
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

Wenn Sie diese also nicht jedes Mal eingeben möchten, wenn Sie die Python-Shell starten möchten, können Sie sie Ihrer .bashrcDatei hinzufügen


1
Ich kann das libexec- Verzeichnis in meiner Apache SparkInstallation nicht finden .
Alberto Bonsanto

@ AlbertoBonsanto Entschuldigung. Ich habe mich diesem Problem nicht gestellt. Also keine Ahnung :(
Dawny33

1
Ja, sie haben den libexec-Ordner in spark 1.5.2
bluerubez

1
@bluerubez Scheint in Spark 1.6.2 da zu sein ... Auch nicht sicher, wofür das libexec/python/buildVerzeichnis ist, aber Spark 1.6.2 hat das nicht
OneCricketeer

17

Auf einem Mac installiere ich mit Homebrew Spark (Formel "Apache-Spark"). Dann habe ich den PYTHONPATH so eingestellt, dass der Python-Import funktioniert:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.2.0
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH

Ersetzen Sie "1.2.0" durch die aktuelle Apache-Spark-Version auf Ihrem Mac.


14

Für eine Spark-Ausführung in pyspark sind zwei Komponenten erforderlich, um zusammenzuarbeiten:

  • pyspark Python-Paket
  • Spark-Instanz in einer JVM

Wenn Sie Dinge mit spark-submit oder pyspark starten, kümmern sich diese Skripte um beides, dh sie richten Ihren PYTHONPATH, PATH usw. so ein, dass Ihr Skript pyspark finden kann, und sie starten auch die spark-Instanz, die gemäß Ihren Parametern konfiguriert wird zB --master X.

Alternativ ist es möglich, diese Skripte zu umgehen und Ihre Spark-Anwendung direkt im Python-Interpreter wie auszuführen python myscript.py. Dies ist besonders interessant, wenn Spark-Skripte komplexer werden und schließlich ihre eigenen Argumente erhalten.

  1. Stellen Sie sicher, dass das pyspark-Paket vom Python-Interpreter gefunden werden kann. Wie bereits erwähnt, fügen Sie entweder das Spark / Python-Verzeichnis zu PYTHONPATH hinzu oder installieren Sie pyspark direkt mit pip install.
  2. Legen Sie die Parameter der Spark-Instanz in Ihrem Skript fest (diejenigen, die früher an pyspark übergeben wurden).
    • Für Spark-Konfigurationen, wie Sie sie normalerweise mit --conf festlegen, werden sie mit einem Konfigurationsobjekt (oder Zeichenfolgenkonfigurationen) in SparkSession.builder.config definiert
    • Für Hauptoptionen (wie --master oder --driver-mem) können Sie diese momentan festlegen, indem Sie in die Umgebungsvariable PYSPARK_SUBMIT_ARGS schreiben. Um die Dinge sauberer und sicherer zu machen, können Sie sie in Python selbst einstellen, und Spark liest sie beim Start.
  3. Starten Sie die Instanz, für die Sie nur getOrCreate()vom Builder-Objekt aus aufrufen müssen .

Ihr Skript kann daher ungefähr so ​​aussehen:

from pyspark.sql import SparkSession

if __name__ == "__main__":
    if spark_main_opts:
        # Set main options, e.g. "--master local[4]"
        os.environ['PYSPARK_SUBMIT_ARGS'] = spark_main_opts + " pyspark-shell"

    # Set spark config
    spark = (SparkSession.builder
             .config("spark.checkpoint.compress", True)
             .config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11")
             .getOrCreate())

9

Um loszuwerden ImportError: No module named py4j.java_gateway, müssen Sie folgende Zeilen hinzufügen:

import os
import sys


os.environ['SPARK_HOME'] = "D:\python\spark-1.4.1-bin-hadoop2.4"


sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python")
sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip")

try:
    from pyspark import SparkContext
    from pyspark import SparkConf

    print ("success")

except ImportError as e:
    print ("error importing spark modules", e)
    sys.exit(1)

7

Unter Windows 10 hat Folgendes für mich funktioniert. Ich habe die folgenden Umgebungsvariablen über Einstellungen > Umgebungsvariablen für Ihr Konto bearbeiten hinzugefügt :

SPARK_HOME=C:\Programming\spark-2.0.1-bin-hadoop2.7
PYTHONPATH=%SPARK_HOME%\python;%PYTHONPATH%

(Ändern Sie "C: \ Programming \ ..." in den Ordner, in dem Sie spark installiert haben.)


5

Für Linux-Benutzer ist das Folgende die richtige (und nicht fest codierte) Methode, um die pyspark libaray in PYTHONPATH aufzunehmen. Beide PATH-Teile sind notwendig:

  1. Der Pfad zum pyspark Python-Modul selbst und
  2. Der Pfad zu der komprimierten Bibliothek, auf die sich das Pyspark-Modul beim Import stützt

Beachten Sie unten, dass die komprimierte Bibliotheksversion dynamisch bestimmt wird, sodass wir sie nicht fest codieren.

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}

4

Ich verwende einen Spark-Cluster auf CentOS VM, der aus Cloudera Yum-Paketen installiert wird.

Musste die folgenden Variablen setzen, um pyspark auszuführen.

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH

4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

Dies habe ich getan, um meine Anaconda-Distribution mit Spark zu verwenden. Dies ist unabhängig von der Spark-Version. Sie können die erste Zeile in den Python-Bin Ihrer Benutzer ändern. Ab Spark 2.2.0 ist PySpark auch als eigenständiges Paket auf PyPi verfügbar, aber ich muss es noch testen.


4

Sie können das pyspark pathin Python wie pipfolgt herunterladen (wenn Sie pyspark mit PIP installiert haben)

pip show pyspark

3

Ich hatte das gleiche Problem.

Stellen Sie außerdem sicher, dass Sie die richtige Python-Version verwenden und diese mit der richtigen Pip-Version installieren. in meinem Fall: Ich hatte sowohl Python 2.7 als auch 3.x. Ich habe pyspark mit installiert

pip2.7 installiere pyspark

und es hat funktioniert.


2

Ich habe diesen Fehler erhalten, weil das Python-Skript, das ich einreichen wollte, pyspark.py ( facepalm ) heißt. Das Update bestand darin, meinen PYTHONPATH wie oben empfohlen festzulegen, das Skript dann in pyspark_test.py umzubenennen und die pyspark.pyc zu bereinigen, die basierend auf dem ursprünglichen Namen meines Skripts erstellt wurde und diesen Fehler behoben hat.


2

Im Fall von DSE (DataStax Cassandra & Spark) Der folgende Speicherort muss zu PYTHONPATH hinzugefügt werden

export PYTHONPATH=/usr/share/dse/resources/spark/python:$PYTHONPATH

Verwenden Sie dann den dse pyspark, um die Module in den Pfad zu bringen.

dse pyspark

2

Ich hatte das gleiche Problem und würde eine Sache zu den oben vorgeschlagenen Lösungen hinzufügen. Wenn Sie Homebrew unter Mac OS X zur Installation von Spark verwenden, müssen Sie die py4j-Pfadadresse korrigieren, um libexec in den Pfad aufzunehmen (denken Sie daran, die py4j-Version in die von Ihnen verwendete zu ändern).

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH

Hinweis - Ich habe versucht, es zu entpacken und py4jnur den Ordner zu verwenden. Es hat nicht funktioniert. Verwenden Sie die Zip-Datei ...
El Dude

2

In meinem Fall wurde es mit einem anderen Python dist_package (Python 3.5) installiert, während ich Python 3.6 verwendete. Das Folgende half also:

python -m pip install pyspark

1

Sie können auch einen Docker-Container mit Alpine als Betriebssystem erstellen und Python und Pyspark als Pakete installieren. Das wird alles containerisiert haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.