HdInsight permet d'utiliser Zeppelin comme notebook. Par defaut, zeppelin n'a pas d'interpreter python. Nous allons voir comment l'installer et automatiser cette installation pour qu'à chaque création du cluster, l'interpreter python soit présent.

Configuration Zeppelin

La configuration doit se faire en plusieurs étapes :
- modifiez la configuration de zeppelin dans Ambari
- installez l'interpreter python sur la machine où zeppelin est installé
- redémarrez zeppelin
- paramétrez zeppelin pour pouvoir utiliser l'interpreter

Dans un premier temps, nous allons modifier la configuration de Zeppelin. Dans Ambari, allez sur "Zeppelin Notebook" puis dans configs. Recherchez le paramètre "zeppelin.interpreter.group.order", ajoutez "python" et sauvegarder.

Nous allons ensuite installer l'interpreter python grâce à une commande Shell. Pour cela, nous utilisons un des interpreter Zeppelin qui permet de lancer des commandes Shell. Allez sur l'interface Zeppelin et utilisez l'interpreter "sh". Lancez la commande suivante :

%sh
/usr/hdp/current/zeppelin-server/bin/install-interpreter.sh -n python

Il faut ensuite redémarrer zeppelin pour que cela soit pris en compte.
Il nous reste une dernière configuration à faire et pour cela, il faut se connecter à l'interface de Zeppelin avec un compte admin.
Une fois connecté avec le compte admin, allez sur la page d'administration des interpreters :

En cliquant sur le bouton "+create", on peut voir dans la liste "interpreter group" que "python" est apparu grâce aux étapes précédentes. Donnez un nom à cet interpreter (nous choisissons ici de l'appeler "python") et sauvegardez :

Après ça, l'interpreter python est fonctionnel. On peut faire un test sur une note :

Automatisation

Pour éviter d'avoir à refaire toutes ces manipulations à chaque création d'un cluster, nous allons scripter tout ce que nous venons de faire.
Tout d'abord, pour le paramètre "zeppelin.interpreter.group.order", nous pouvons injecter des paramètres lors de l'installation, en utilisant un template ARM de création de cluster HdInsight.

Vous pouvez trouver des exemples de templates ARM de création de cluster HdInsight ici : https://azure.microsoft.com/en-us/resources/templates/?term=hdinsight
La propriété JSON "clusterDefinition" contient une propriété "configurations" dans laquelle nous pouvons initialiser les paramètres des fichiers de configuration du cluster. Nous allons ici ajouter une section "zeppelin-config" dans laquelle nous initialisons le paramètre "zeppelin.interpreter.group.order".

Ce qui ressemble à ceci :

"clusterDefinition": {
                    "kind": "[parameters('clusterKind')]",
                    "componentVersion": {
                        "InteractiveHive": "3.1"
                    },
                    "configurations": {
                        "gateway": {
                            ...
                        },
                        "hive-site": {
                            ...
                        },
                        "zeppelin-config": {
                            zeppelin.interpreter.group.order : "spark,angular,jdbc,livy,md,sh,python"
                        }

Une fois que le cluster est créé avec ce paramètre, nous pouvons créer un script Shell à lancer en tant que Action Script.
Dans ce script, nous allons installer l'interpreter python avec la commande "/usr/hdp/current/zeppelin-server/bin/install-interpreter.sh -n python" comme vu plus haut, sauf que nous allons la lancer avec l'utilisateur Zeppelin. Toujours avec l'utilisateur Zeppelin, nous allons lancer une commande qui redémarre Zeppelin. Si nous n'utilisons pas l'utilisateur Zeppelin, le service ne redémarrera pas car il ne disposera pas des droits nécessaires :

sudo runuser -l zeppelin -c '/usr/hdp/current/zeppelin-server/bin/install-interpreter.sh -n python'
sudo runuser -l zeppelin -c '/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh restart'

Ensuite pour ajouter l'interpreter avec le compte admin Zeppelin, nous pouvons l'automatiser avec des requêtes CURL. Tout d'abord, une requête POST pour se connecter puis une requête POST pour ajouter l'interpreter. Remplacer <password> et <zeppelin_admin> pour vos identifiants admin de zeppelin :

curl -v -c cookie.txt -d 'password=<password>;userName=<zeppelin_admin>' http://localhost:9995/api/login
curl -v --cookie cookie.txt -H 'Content-Type: application/json;charset=UTF-8' \
-d '{"name":"python","group":"python","properties":{"zeppelin.python":"python","zeppelin.python.maxResult":"1000"},"dependencies":[],"option":{"remote":true,"isExistingProcess":false,"setPermission":false,"session":false,"process":false,"perNote":"shared","perUser":"shared","users":[]},"propertyValue":"","propertyKey":""}' \
http://localhost:9995/api/interpreter/setting

Il faudra penser à attendre un peu entre ces commandes CURL et le redémarrage de Zeppelin en utilisant par exemple la commande "sleep 15", sinon les commandes CURL échoueront.

Nous avons là de quoi faire un Action Script à lancer à chaque création de cluster. Sauf qu'en l'état, il y aura une erreur, car le script serait lancé sur les 2 headnodes, alors que Zeppelin n'est installé que sur un Headnode. Il faut donc ajouter une condition qui permet de lancer le script uniquement s'il est sur le "headnode 0". Voici le script complet :

#! /bin/bash

shorthostname=$(hostname -s)

if [[ $shorthostname == hn0* ]]; then
	
	echo "*************************** Installation de l'interpreter python **************************"
	sudo runuser -l zeppelin -c '/usr/hdp/current/zeppelin-server/bin/install-interpreter.sh -n python'
	
	echo "*************************** Restart Zeppelin **************************"
	sudo runuser -l zeppelin -c '/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh restart'
	sleep 15

	echo "*************************** Authentication to Zeppelin**************************"
	curl -v -c cookie.txt -d 'password=<password>&userName=<zeppelin_admin>' http://localhost:9995/api/login

	echo "*************************** Activation Python sur Zeppelin**************************"
	curl -v --cookie cookie.txt -H 'Content-Type: application/json;charset=UTF-8' -d '{"name":"python","group":"python","properties":{"zeppelin.python":"python","zeppelin.python.maxResult":"1000"},"dependencies":[],"option":{"remote":true,"isExistingProcess":false,"setPermission":false,"session":false,"process":false,"perNote":"shared","perUser":"shared","users":[]},"propertyValue":"","propertyKey":""}' http://localhost:9995/api/interpreter/setting

else
    echo "*************************** Pas sur le headnode 0**************************"
fi

Liens
Exemples de template ARM : https://azure.microsoft.com/en-us/resources/templates/?term=hdinsight
Utilisation de Zeppelin sur HdInsight : https://docs.microsoft.com/en-us/azure/hdinsight/spark/apache-spark-zeppelin-notebook
Documentation Apache de l'interpreter Python : https://zeppelin.apache.org/docs/0.6.2/interpreter/python.html

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.