wake-up-neo.com

Konfiguration 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 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:
12
puifais

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()
7
Alain Domissy

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 die kernel.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"
42
desertnaut

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.

0
matanster