Jupyter est un service de notebook permettant d’exécuter du code (Scala, Python, R …) depuis un navigateur. L’exécution se déroule coté serveur et permet par exemple de donner un accès à un cluster spark sans pour autant confier un accès direct au spark master.
docker service create --name jupyter-spark --network spark-net -p 8888:8888 -e SPARK_OPTS="--master=spark://spark-master:7077" jupyter/all-spark-notebook
La version de Spark inclue dans cette image Docker est la 1.6.1 et n’est pas compatible avec la version installée sur le serveur (2.0.0). Le Kernel Apark pour Jupyter est développé par Apache et n’est pour l’instant compatible que avec la version 1.6.1 en version stable, cependant la branche master de leur git est déjà compatible avec la version 2.0.0 il est donc possible de tester cette dernière version voir si elle ne comporte pas trop de bugs l’utiliser en attendant la sortie de la version stable.
Le Kernel arrive à se connecter au cluster mais il n’est pas possible de lancer des jobs. Il faut vérifier que la connexion peut bien s’effectuer. En y regardant de plus près on voit que la même erreur qui arrivait avec le master arrive avec le kernel Jupyter. C’est à dire qu’en exposant le port 8888 on connecte le container au réseau ingress (qui permet d’exposer des ports) et ajoute donc une carte réseau virtuelle visible par le container, cependant il considère cette cart eréseau comme principale et annonce donc cette adresse à spark qui demande ensuite aux workers de renvoyer les données vers cette ip qui leur est donc inaccessible :
"--driver-url" "spark://CoarseGrainedScheduler@10.255.0.15:38444"
Cette option est donc mal configurée, il va falloir procéder comme avec le master spark c’est à dire créer une entrée dans le proxy pour ne connecter le notebook Jupyter qu’a une seule carte réseau.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 8888;
location / {
proxy_pass http://jupyter-spark;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
# WebSocket support
proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
proxy_set_header Connection $connection_upgrade;
proxy_set_header Origin "";
proxy_read_timeout 86400;
}
}
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df =sqlContext.sql("SELECT * FROM parquet.`hdfs://hdfs-namenode:8020/tmass.parquet` LIMIT 10")
println(df.count)
df.first
10
[03000761+1814345,45.031747,18.242929,0.11,0.1,90,15.81,15.395,15.244,0.078,0.099,0.135,AAB,222,0,2451856.8906,1044485]