3 Octobre 2016

Test de Jupyter

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.

Démarage du service

docker service create --name jupyter-spark --network spark-net -p 8888:8888 -e SPARK_OPTS="--master=spark://spark-master:7077" jupyter/all-spark-notebook

Problème

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.

Test avec la version 1.6.1 de Spark

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.

Jupyter fonctionnel

Config Nginx

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;
    }
}

Lancement d’une requete SQL

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]

A faire

  • Précharger des librairies Scala