Konfigurieren von Spark für die Arbeit mit Jupyter Notebook und Anaconda

Ich habe jetzt ein paar Tage damit verbracht, Spark mit meinem Jupyter Notebook und Anaconda arbeiten zu lassen. So sieht mein .bash_profile aus:

PATH="/my/path/to/anaconda3/bin:$PATH" export JAVA_HOME="/my/path/to/jdk" export PYTHON_PATH="/my/path/to/anaconda3/bin/python" export PYSPARK_PYTHON="/my/path/to/anaconda3/bin/python" export PATH=$PATH:/my/path/to/spark-2.1.0-bin-hadoop2.7/bin export PYSPARK_DRIVER_PYTHON=jupyter export PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark export SPARK_HOME=/my/path/to/spark-2.1.0-bin-hadoop2.7 alias pyspark="pyspark --conf spark.local.dir=/home/puifais --num-executors 30 --driver-memory 128g --executor-memory 6g --packages com.databricks:spark-csv_2.11:1.5.0" 

Wenn ich /my/path/to/spark-2.1.0-bin-hadoop2.7/bin/spark-shell , kann ich Spark einfach in meiner Kommandozeilen-Shell starten. Und die Ausgabe sc ist nicht leer. Es scheint gut zu funktionieren.

Wenn ich pyspark , startet mein Jupyter Notebook gut. Wenn ich ein neues Python3-Notizbuch erstelle, erscheint folgender Fehler:

 [IPcoreelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/shell.py: 

Und sc in meinem Jupyter Notebook ist leer.

Kann jemand helfen, diese Situation zu lösen?


Ich will nur klarstellen: Es gibt nichts nach dem Doppelpunkt am Ende des Fehlers. Ich habe auch versucht, meine eigene Start-up-Datei mit diesem Post zu erstellen und ich zitiere hier, so dass Sie nicht dorthin gehen müssen:

Ich habe ein kleines Initialisierungsskript init_spark.py wie folgt erstellt:

 from pyspark import SparkConf, SparkContext conf = SparkConf().setMaster("yarn-client") sc = SparkContext(conf = conf) 

und platzierte es im Verzeichnis ~ / .ipython / profile_default / startup /

Als ich das tat, wurde der Fehler dann:

 [IPcoreelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/shell.py: [IPcoreelApp] WARNING | Unknown error in handling startup files: 

Conda kann helfen, viele Abhängigkeiten richtig zu verwalten …

Funken installieren. Angenommen, Spark ist in / opt / spark installiert, fügen Sie dies in Ihre ~ / .bashrc ein:

 export SPARK_HOME=/opt/spark export PATH=$SPARK_HOME/bin:$PATH 

Erstellen Sie eine Conda-Umgebung mit allen erforderlichen Abhängigkeiten außer Spark:

 conda create -n findspark-jupyter-openjdk8-py3 -c conda-forge python=3.5 jupyter=1.0 notebook=5.0 openjdk=8.0.144 findspark=1.1.0 

Aktiviere die Umgebung

 $ source activate findspark-jupyter-openjdk8-py3 

Starten Sie einen Jupyter Notebook-Server:

 $ jupyter notebook 

Erstellen Sie in Ihrem Browser ein neues Python3-Notizbuch

Versuchen Sie PI mit dem folgenden Skript zu berechnen (entlehnt davon )

 import findspark findspark.init() import pyspark import random sc = pyspark.SparkContext(appName="Pi") num_samples = 100000000 def inside(p): x, y = random.random(), random.random() return x*x + y*y < 1 count = sc.parallelize(range(0, num_samples)).filter(inside).count() pi = 4 * count / num_samples print(pi) sc.stop() 

Nun, es schmerzt mich wirklich zu sehen, wie PYSPARK_DRIVER_PYTHON=jupyter Hacks, wie PYSPARK_DRIVER_PYTHON=jupyter , zu “Lösungen” gemacht wurden und nun zu Standardpraktiken werden, trotz der Tatsache, dass sie offensichtlich zu hässlichen Ergebnissen führen, wie das Tippen von pyspark und endend mit einem Jupyter-Notebook anstelle einer PySpark-Shell und noch nie gesehenen Problemen, die stromabwärts lauern, wie wenn du versuchst, spark-submit mit den obigen Einstellungen zu verwenden … 🙁

(Versteh mich nicht falsch, es ist nicht deine Schuld und ich mache dir keine Vorwürfe; ich habe Dutzende von Beiträgen hier in SO gesehen, wo diese “Lösung” vorgeschlagen, akzeptiert und aufgewertet wurde …).

Es gibt eine einzige Möglichkeit, ein Jupyter-Notizbuch anzupassen, um mit anderen Sprachen zu arbeiten (PySpark hier), und dies ist die Verwendung von Jupyter-coreen .

Als Erstes führen jupyter kernelspec list Befehl jupyter kernelspec list , um die Liste aller bereits verfügbaren coreel in Ihrem Rechner zu erhalten. Hier ist das Ergebnis in meinem Fall (Ubuntu):

 $ jupyter kernelspec list Available kernels: python2 /usr/lib/python2.7/site-packages/ipykernel/resources caffe /usr/local/share/jupyter/kernels/caffe ir /usr/local/share/jupyter/kernels/ir pyspark /usr/local/share/jupyter/kernels/pyspark pyspark2 /usr/local/share/jupyter/kernels/pyspark2 tensorflow /usr/local/share/jupyter/kernels/tensorflow 

Der erste coreel, python2 , ist der “Standard”, der mit IPython kommt (es besteht eine große Chance, dass dies der einzige coreel in Ihrem System ist); Für den Rest habe ich zwei weitere Python-coreel ( tensorflow & tensorflow ), einen R one ( ir ) und zwei PySpark-coreel zur Verwendung mit Spark 1.6 bzw. Spark 2.0.

Die Einträge der obigen Liste sind Verzeichnisse, und jedes enthält eine einzige Datei namens kernel.json . Lassen Sie uns den Inhalt dieser Datei für meinen pyspark2 coreel sehen:

 { "display_name": "PySpark (Spark 2.0)", "language": "python", "argv": [ "/opt/intel/intelpython27/bin/python2", "-m", "ipykernel", "-f", "{connection_file}" ], "env": { "SPARK_HOME": "/home/ctsats/spark-2.0.0-bin-hadoop2.6", "PYTHONPATH": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python:/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/lib/py4j-0.10.1-src.zip", "PYTHONSTARTUP": "/home/ctsats/spark-2.0.0-bin-hadoop2.6/python/pyspark/shell.py", "PYSPARK_PYTHON": "/opt/intel/intelpython27/bin/python2" } } 

Ich habe mir nicht die Mühe gemacht, meine Details in /my/path/to zu ändern, und Sie können bereits sehen, dass es einige Unterschiede zwischen unseren Fällen gibt (ich benutze Intel Python 2.7 und nicht Anaconda Python 3), aber hoffentlich bekommen Sie die Idee (BTW, mach dir keine Sorgen um die connection_file – ich benutze auch keine).

Nun, der einfachste Weg für Sie wäre, die notwendigen Änderungen (nur Pfade) manuell zu meinem oben gezeigten coreel .../jupyter/kernels und in einem neuen Unterordner des Verzeichnisses .../jupyter/kernels (auf diese Weise sollte es sichtbar sein, wenn Sie führen erneut einen jupyter kernelspec list Befehl). Und wenn Sie meinen, dass dieser Ansatz auch ein Hack ist, dann würde ich Ihnen zustimmen, aber es ist der in der Jupyter-Dokumentation (Seite 12) empfohlene:

Es gibt jedoch keine großartige Möglichkeit, die coreel-Spezifikationen zu ändern. Ein Ansatz verwendet jupyter kernelspec list , um die Datei jupyter kernelspec list zu finden und modifiziert sie dann z. B. kernels/python3/kernel.json .

Wenn Sie noch keinen .../jupyter/kernels Ordner haben, können Sie immer noch einen neuen coreel mit jupyter kernelspec install – ich habe es nicht versucht, aber schauen Sie sich diese SO-Antwort an .

Vergessen Sie nicht, alle PySpark-bezogenen Umgebungsvariablen aus Ihrem Bash-Profil zu entfernen (nur SPARK_HOME sollte OK bleiben). Und bestätige, dass du, wenn du pyspark , dich mit einer PySpark-Shell findest, wie es sein sollte, und nicht mit einem Jupyter-Notebook …

UPDATE (nach Kommentar): Wenn Sie Kommandozeilenargumente an PySpark übergeben möchten, sollten Sie die Einstellung PYSPARK_SUBMIT_ARGS unter env hinzufügen; Hier ist zum Beispiel die letzte Zeile meiner coreel-Datei für Spark 1.6.0, wo wir noch das externe Spark-CSV-Paket zum Lesen von CSV-Dateien verwenden mussten:

 "PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-shell"