web-dev-qa-db-fra.com

Configuration de Spark pour fonctionner avec Jupyter Notebook et Anaconda

J'ai passé quelques jours à essayer de faire fonctionner Spark avec mon bloc-notes Jupyter et Anaconda. Voici à quoi ressemble mon .bash_profile:

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"

Quand je tape /my/path/to/spark-2.1.0-bin-hadoop2.7/bin/spark-Shell, Je peux lancer Spark très bien dans ma ligne de commande Shell. Et la sortie sc n'est pas vide. Il semble fonctionner correctement.

Lorsque je tape pyspark, il lance très bien mon bloc-notes Jupyter. Lorsque je crée un nouveau bloc-notes Python3, cette erreur apparaît:

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

Et sc dans mon carnet Jupyter est vide.

Quelqu'un peut-il aider à résoudre cette situation?


Je veux juste clarifier: il n'y a rien après les deux points à la fin de l'erreur. J'ai également essayé de créer mon propre fichier de démarrage à l'aide de cette post et je cite ici afin que vous n'ayez pas à y chercher:

J'ai créé un court script d'initialisation init_spark.py comme suit:

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

et l'a placé dans le répertoire ~/.ipython/profile_default/startup /

Quand je l'ai fait, l'erreur est devenue:

[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 peut aider à gérer correctement de nombreuses dépendances ...

Installez l'étincelle. En supposant que spark est installé dans/opt/spark, incluez ceci dans votre ~/.bashrc:

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

Créez un environnement conda avec toutes les dépendances nécessaires en dehors de 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

Activer l'environnement

$ source activate findspark-jupyter-openjdk8-py3

Lancez un serveur Jupyter Notebook:

$ jupyter notebook

Dans votre navigateur, créez un nouveau bloc-notes Python3

Essayez de calculer PI avec le script suivant (emprunté à 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

Eh bien, ça me fait vraiment mal de voir comment les hacks merdiques, comme mettre PYSPARK_DRIVER_PYTHON=jupyter, ont été promus "solutions" et tendent maintenant à devenir des pratiques standard, en dépit du fait qu'elles conduisent évidemment à des résultats moches , comme taper pyspark et se retrouver avec un bloc-notes Jupyter au lieu d'un shell PySpark, ainsi que des problèmes encore invisibles qui se cachent en aval, comme lorsque vous essayez d'utiliser spark-submit avec les paramètres ci-dessus ... :(

(Ne vous méprenez pas, ce n'est pas de votre faute et je ne vous blâme pas; j'ai vu des dizaines de messages ici à SO où cette "solution" a été proposée, acceptée et voté ...).

Il existe une et une seule façon de personnaliser un bloc-notes Jupyter afin de travailler avec d'autres langues (PySpark ici), et c'est l'utilisation de noyaux Jupyter .

La première chose à faire est d'exécuter un jupyter kernelspec list commande, pour obtenir la liste des noyaux déjà disponibles dans votre machine; voici le résultat dans mon cas (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

Le premier noyau, python2, est celui "par défaut" fourni avec IPython (il y a de fortes chances que ce soit le seul présent dans votre système); comme pour le reste, j'ai 2 autres Python noyaux (caffe & tensorflow), un R un (ir), et deux Les noyaux PySpark à utiliser avec Spark 1.6 et Spark 2.0 respectivement).

Les entrées de la liste ci-dessus sont des répertoires, et chacun contient un seul fichier, nommé kernel.json. Voyons le contenu de ce fichier pour mon pyspark2 noyau:

{
 "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"
 }
}

Je n'ai pas pris la peine de changer mes coordonnées en /my/path/to etc., et vous pouvez déjà voir qu'il y a des différences entre nos cas (j'utilise Intel Python 2.7, et non Anaconda Python 3), mais j'espère que vous aurez l'idée (BTW, ne vous inquiétez pas pour le connection_file - Je n'en utilise pas non plus).

Maintenant, la façon la plus simple pour vous serait de faire manuellement les modifications nécessaires (chemins uniquement) à mon noyau ci-dessus et de l'enregistrer dans un nouveau sous-dossier du .../jupyter/kernels répertoire (de cette façon, il devrait être visible si vous exécutez à nouveau un jupyter kernelspec list commande). Et si vous pensez que cette approche est aussi un hack, eh bien, je serais d'accord avec vous, mais c'est celle recommandée dans la documentation Jupyter (page 12):

Cependant, il n'y a pas un excellent moyen de modifier les kernelspecs. Une approche utilise jupyter kernelspec list pour trouver le kernel.json fichier puis le modifie, par exemple kernels/python3/kernel.json, par la main.

Si vous ne disposez pas déjà d'un .../jupyter/kernels, vous pouvez toujours installer un nouveau noyau en utilisant jupyter kernelspec install - je ne l'ai pas essayé, mais jetez un œil à this SO answer .

Enfin, n'oubliez pas de supprimer toutes les variables d'environnement liées à PySpark de votre profil bash (ne laissant que SPARK_HOME ça devrait être bon). Et confirmez que lorsque vous tapez pyspark, vous vous retrouvez avec un PySpark Shell, comme il se doit, et non avec un cahier Jupyter ...

[~ # ~] update [~ # ~] (après commentaire): Si vous voulez passer des arguments de ligne de commande à PySpark, vous devez ajouter le PYSPARK_SUBMIT_ARGS paramètre sous env; par exemple, voici la dernière ligne de mon fichier de noyau respectif pour Spark 1.6.0, où nous devions encore utiliser le package spark-csv externe pour lire les fichiers CSV:

"PYSPARK_SUBMIT_ARGS": "--master local --packages com.databricks:spark-csv_2.10:1.4.0 pyspark-Shell"
42
desertnaut

Après avoir joué un peu ici, j'ai juste installé sparkmagic (après avoir réinstallé une version plus récente de Spark). Je pense que cela fonctionne tout simplement.

Je ne suis pas sûr d'avoir joué un peu avant, mais je le place comme une réponse provisoire car c'est beaucoup plus simple que de manipuler les fichiers de configuration à la main.

0
matanster