Ich habe jetzt ein paar Tage damit verbracht, Spark mit meinem Jupyter Notebook und Anaconda zu arbeiten. 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
, Ich kann Spark gut in meiner Kommandozeilen-Shell starten. Und die Ausgabe sc
ist nicht leer. Es scheint gut zu funktionieren.
Wenn ich pyspark
eingebe, wird mein Jupyter Notebook in Ordnung gestartet. Wenn ich ein neues Python3-Notizbuch erstelle, wird folgender Fehler angezeigt:
[IPKernelApp] 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-Notizbuch ist leer.
Kann jemand helfen, diese Situation zu lösen?
Ich möchte nur klarstellen: Am Ende des Fehlers steht nach dem Doppelpunkt nichts. Ich habe auch versucht, meine eigene Startdatei mit dem folgenden Befehl zu erstellen: post und ich zitiere hier, damit Sie nicht dorthin schauen müssen:
Ich habe ein kurzes Initialisierungsskript init_spark.py wie folgt erstellt:
from pyspark import SparkConf, SparkContext conf = SparkConf().setMaster("yarn-client") sc = SparkContext(conf = conf)
und im Verzeichnis ~/.ipython/profile_default/startup/abgelegt
Als ich das tat, wurde der Fehler dann:
[IPKernelApp] WARNING | Unknown error in handling PYTHONSTARTUP file /my/path/to/spark-2.1.0-bin-hadoop2.7/python/pyspark/Shell.py:
[IPKernelApp] WARNING | Unknown error in handling startup files:
Conda kann helfen, viele Abhängigkeiten richtig zu verwalten ...
Funken einbauen. Unter der Annahme, dass spark in/opt/spark installiert ist, 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 benötigten 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
Aktivieren Sie 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 von this )
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 tut mir wirklich weh zu sehen, wie beschissene Hacks, wie das Setzen von PYSPARK_DRIVER_PYTHON=jupyter
, Zu "Lösungen" heraufgestuft wurden und jetzt zu Standardpraktiken werden, obwohl sie offensichtlich zu hässliche Ergebnisse, wie das Eingeben von pyspark
und das Beenden mit einem Jupyter-Notizbuch anstelle einer PySpark-Shell, plus noch nie dagewesene Probleme, die sich stromabwärts lauern, wie zum Beispiel wenn Sie = versuchen Sie, spark-submit
mit den obigen Einstellungen zu verwenden ... :(
(Verstehen Sie mich nicht falsch, es ist nicht Ihre Schuld und ich beschuldige Sie nicht. Ich habe Dutzende von Posts hier bei SO gesehen, in denen diese "Lösung" vorgeschlagen, akzeptiert und positiv bewertet wurde.) .).
Es gibt nur eine Möglichkeit, ein Jupyter-Notizbuch so anzupassen, dass es mit anderen Sprachen funktioniert (PySpark hier). Dies ist die Verwendung von Jupyter-Kerneln .
Führen Sie zunächst den Befehl jupyter kernelspec list
Aus, um die Liste aller bereits auf Ihrem Computer verfügbaren Kernel abzurufen. 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 Kernel, python2
, Ist der "Standard" -Kernel, der mit IPython geliefert wird (es besteht die große Wahrscheinlichkeit, dass dies der einzige ist, der in Ihrem System vorhanden ist). im übrigen habe ich 2 weitere Python Kernel (caffe
& tensorflow
), einen R-Kernel (ir
) und zwei PySpark-Kernel für Verwendung mit Spark 1.6 bzw. Spark 2.0.
Die Einträge in der obigen Liste sind Verzeichnisse und jedes enthält eine einzelne Datei mit dem Namen kernel.json
. Sehen wir uns den Inhalt dieser Datei für meinen Kernel pyspark2
An:
{
"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 mich nicht die Mühe gemacht, meine Daten in /my/path/to
Usw. zu ändern, und Sie können bereits feststellen, dass es einige Unterschiede zwischen unseren Fällen gibt (ich verwende Intel Python 2.7 und nicht Anaconda Python 3), aber hoffentlich haben Sie die Idee (Übrigens, machen Sie sich keine Sorgen um den connection_file
- ich verwende auch keinen).
Der einfachste Weg für Sie wäre nun, die notwendigen Änderungen (nur Pfade) an meinem oben gezeigten Kernel manuell vorzunehmen und in einem neuen Unterordner des Verzeichnisses .../jupyter/kernels
Zu speichern (auf diese Weise sollte es sichtbar sein, wenn Sie Führen Sie erneut einen jupyter kernelspec list
- Befehl aus. Und wenn Sie denken, dass dieser Ansatz auch ein Hack ist, stimme ich Ihnen zu, aber er ist derjenige, der in der Jupyter-Dokumentation (Seite 12) empfohlen wird:
Es gibt jedoch keine gute Möglichkeit, die Kernelspezifikationen zu ändern. Ein Ansatz verwendet
jupyter kernelspec list
, Um diekernel.json
- Datei zu finden und sie dann zu modifizieren, z.kernels/python3/kernel.json
Von Hand.
Wenn Sie noch keinen Ordner .../jupyter/kernels
Haben, können Sie mit jupyter kernelspec install
Immer noch einen neuen Kernel installieren - haben es noch nicht ausprobiert, aber schauen Sie sich this SO antworte .
Vergessen Sie nicht, alle mit PySpark zusammenhängenden Umgebungsvariablen aus Ihrem Bash-Profil zu entfernen (es sollte nur SPARK_HOME
In Ordnung sein). Und bestätigen Sie, dass Sie sich bei der Eingabe von pyspark
mit einer PySpark-Shell befinden, wie sie sein sollte, und nicht mit einem Jupyter-Notizbuch ...
[~ # ~] update [~ # ~] (nach Kommentar): Wenn Sie Befehlszeilenargumente an PySpark übergeben möchten, sollten Sie das hinzufügen Einstellung PYSPARK_SUBMIT_ARGS
Unter env
; Hier ist zum Beispiel die letzte Zeile meiner jeweiligen Kerneldatei für Spark 1.6.0, in der 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"
Nachdem ich hier ein wenig herumgespielt habe, habe ich nur sparkmagic installiert (nachdem ich eine neuere Version von Spark neu installiert habe). Ich denke das alleine funktioniert einfach.
Ich bin mir nicht sicher, ob ich vorher ein bisschen herumgespielt habe, aber ich gebe dies als vorläufige Antwort, da es viel einfacher ist, als Konfigurationsdateien von Hand zu fummeln.