====== Montez un cluster spark avec docker ====== ===== Avant de commencer ===== Ce TP est noté et se fait en binôme, il est important de vérifier que ces derniers sont corrects sur tomuss (case ''GroupeTpNote'') et de les modifier sinon. Il ne sera pas possible de changer un groupe après aujourd'hui. Vérifiez aussi que vous pouvez accéder au Projet du TP : **TIW7-Note** Le TP est normalement faisable dans le temps impartit, vous ne devez pas partir sans avoir fait vérifier, par l'un des enseignants, ce que vous avez réussit à faire. Vous devez aussi rendre un rapport en fin de séance. Une grande partie de la note dépendra de votre capacité à suivre les instructions sur place. Ne vous inquiétez pas si vous ne parvenez pas à terminer aujourd'hui, vous pourrez refaire des machines et rendre un autre rapport d'ici le 18/2/18, un travail correct à cette date devrait vous assurer la moyenne. Attention, pour être comptabilisées, les machines devront être différentes de celle d'aujourd'hui et accessibles par les enseignants. Attention toutes les machines crées aujourd'hui seront supprimées ce weekend, le projet sera détruit. Vous ne devez pas y laisser de données importantes et si vous travaillez chez vous, utilisez un autre projet. **Pour poursuivre le projet chez vous il faut donc tout recommencer ailleur** ===== Introduction ===== Comme la plupart d'entre vous doivent le savoir, //Apache Spark// est un framework de calcul distribué. Il est généralement assez compliqué de monter un cluster sans aide, mais vous verrez dans ce TP que docker permet de le faire sans vraiment comprendre le fonctionnement interne de ces outils. En effet, il existe de nombreux exemples proposant des dockers prêts à l'emploi lançant des nœuds de cluster. Il suffit donc de les créer avec les bonnes options. Pour ce TP je me suis basé sur les dockers proposés par {{https://github.com/gettyimages|gettyimages}} ils sont légèrement modifiés pour intégrer l'utilisation d'HDFS dans le cluster. Vous pouvez trouver tout le nécessaire{{ :cloud:2017:tp_spark:docker-spark.zip |ici}} Cette archive contient : * Un fichier //docker-compose// qui décrit le lancement d'un cluster sur une seule machine (pour information uniquement). * Trois répertoires pour générer des images de docker : * une image qui sera utilisé comme base par les 2 suivantes; * une image de //master// (image de base avec un certain script de lancement); * une image de //slave// (image de base avec un autre script de lancement). * Un répertoire avec les configurations nécessaires au //master// et au //slave//. Ces fichiers ne doivent a mon avis pas être modifiés. ===== Travail à faire ===== ==== I. Création des VMs ==== Utilisez pour ce TP le projet ''TIW7-Note'' dont on peut trouver l'identifiant dans l'onglet ''Projects'' de l'interface horizon. Grâce à docker machine vous devez créer 2 VMs capables de gérer docker. Ces machines doivent se baser sur le snapshot ''snap-tpnote'' et utiliser le gabari (//flavor//) ''m1.small''. * Dans votre rapport, vous fournirez une copie des commandes ''docker-machine'' utilisées. * Sur tomuss dans les cases TPNote-IP-Manager et TPNote-IP-Worker vous préciserez leur IP, dans les cases TPNote-Cle-Manager et TPNote-Cle-Worker vous fournirez leur clef ssh (privées) * La première VM doit s'appeler ''manager-vosnom'' et la seconde ''worker-vosnom'' Vous devez configurer ces VMs pour participer à un cluster //swarm//, la première étant nœud //manager// et la seconde //worker//. Enfin vous devez créer un réseau //overlay// //attachable// dont le nom est ''res-spark'' et dont les adresses sont ''172.30.0.0/24''. Dans votre rapport, bien sur donnez toutes les commandes utilisées pour faire ces opérations. ==== II. Création des images ==== Commencez par créer un //registry// dans le réseau normal des dockers sur la machine //manager// et faites en sorte de transférer le port 5000 de l'hôte sur celui du //registry//. * Créez les 3 images ''hadoopspark-ucbl'', ''hadoopspark-ucbl-master'' et ''hadoopspark-ucbl-slave'' sur le //manager//. * Ajoutez les 2 images ''hadoopspark-ucbl-master'' et ''hadoopspark-ucbl-slave'' au registry. Là encore votre rapport doit mentionner toutes les commandes ou modifications nécessaires. ==== III. Création du cluster ==== Sur le nœud //manager// créez un master spark et un esclave spark. Sur le nœud worker seulement un esclave spark. Attention de bien configurer les dockers selon c tableau : ^ ^ Master ^ Slave1 ^ Slave2 ^ ^ Réseau | res-spark ||| ^ Hôte | manager | manager | worker | ^ IP | 172.30.0.11 | 172.30.0.12 | 172.30.0.13 | ^ Nom | master | slave1 | slave2 | ^ Hostname | master | slave1 | slave2 | ^ Partage de ports | 7077:7077 | 8181:8181 | 8181:8181 | | ::: | 8080:8080 | | | ^ Partage de volume | ./conf/master:/conf | /conf/worker:/conf | /conf/worker:/conf | ^ Host connus | | master:172.30.0.11 | master:172.30.0.11 | De plus, il faut correctement définir les variables d'environnement pour chaque docker : * Pour le //master// SPARK_CONF_DIR=/conf SPARK_PUBLIC_DNS=localhost MASTER=spark://master:7077 * pour les esclaves : SPARK_CONF_DIR=/conf SPARK_PUBLIC_DNS=localhost SPARK_WORKER_MEMORY=1g SPARK_WORKER_PORT=8881 SPARK_WORKER_WEBUI_PORT=8181 ==== IV Tester le cluster ==== Le manager doit proposer une interface web à l'adresse [[http://adressemanager:8080]] cette interface doit mentionner les 2 workers. A cause du firewall, il ne doit pas être possible de consulter les interfaces des esclaves sans tunnel ssh. === Test de hdfs === Vous pouvez accéder aux docker en utilisant un shell bash : docker exec -it master bash docker exec -it slave1 bash docker exec -it slave1 bash Dans ces dockers, les commande hdfs fonctionne. Vous devez pouvoir créer un répertoire et y copier des fichiers. * ''hdfs dfs -mkdir /rep'' créer un répertoire sur le hdfs * ''hdfs dfs -copyFromLocal unfichier /rep'' copier un fichier dans le répertoire * ''hdfs dfs -ls /rep'' lister les fichiers présent dans le répertoire * ''hdfs dfs -cat /rep/nomfih'' afficher le contenu d'un fichier Une documentation plus poussée des commandes est présente [[https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/FileSystemShell.html|ici]] //hdfs// est fonctionnel si vous pouvez depuis le manager créer un répertoire et copier un petit fichier dedans (de préférence un fichier text). Et si ces modifications sont visible depuis les deux esclaves. === Tester spark === Vous pouvez utiliser le code //wordcount// par exemple [[https://spark.apache.org/examples.html|ici]], le code en //scala// est directement utilisable dans un ''spark-shell''. Ce code nécessite 2 répertoires hdfs, l'un en entrée et l'un en sortie. Si vous avez préparé un répertoire contenant des fichiers textes, vous pouvez l'utiliser en entrée. Le programme créera lui même le répertoire de sortie (qui ne doit pas exister avant). Tout fonctionne si le répertoire de sortie contient un fichier ''SUCCESS'' et si les autre fichiers contiennent le nom de fois que chaque mot est présent dans les fichier du répertoire d'entrée.