Hadoop / Big Data Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS 2014-2015
TP 3 TP noté Méthodologie Map/Reduce - programmation Hadoop - Sqoop
Préparation du TP 1 Importer la machine virtuelle.ova du TP. Il s'agit d'un système GNU/Linux Debian, amd64. Il ne s'agit pas de la même machine virtuelle que précédemment. Démarrer la machine virtuelle. S'identifier avec le login: hadoop, mot de passe: mbds. Démarrer Hadoop avec les commandes: start-dfs.sh & start-yarn.sh & (ignorer les warnings)
Préparation du TP 2 Vérifier le bon fonctionnement de Hadoop en exécutant la commande: hdfs dfsadmin -report La commande vérifie le statut de HDFS. Elle devrait afficher: Datanodes available: 1 (1 total, 0 dead)
Objectifs 3 Ce TP est noté. Il peut être effectué seul ou en groupe (au maximum 4 personnes). Merci d'envoyer la constitution de vos groupes à l'adresse: ben@tokidev.fr. Le TP constitue une mise en situation; il vise à évaluer votre compréhension et votre maîtrise de la méthodologie map/reduce, de Hadoop, et de l'outil additionnel Sqoop dans un exemple applicatif «réaliste».
Objectifs 4 On imagine qu'une entreprise (à titre d'exemple, Microsoft) souhaite connaître les tendances d'opinion la concernant en analysant les tweets la concernant: ceux contenant le hashtag #Microsoft. Une tâche automatisée importe régulièrement ces tweets au sein d'une base de données MySQL, dans une table tweets. Par ailleurs, un formulaire a été mis en place permettant de sélectionner une période de temps. Ce formulaire produit deux ids numériques: id_min et id_max, correspondant à la clef primaire id du premier tweet à analyser et à celle du dernier tweet à analyser, au sein de la table de la base MySQL.
Objectifs 5 Vous avez pour tâche de développer un script qui va: Recevoir les valeurs id_min et id_max. Exécuter un import Sqoop pour récupérer les tweets correspondant à ces valeurs depuis la base MySQL dans HDFS. Exécuter un programme Hadoop map/reduce analysant les tweets ainsi importés pour déterminer une mesure d'opinion basique. Exécuter un export Sqoop pour exporter les résultats de l'analyse au sein d'une seconde table results dans la même base de données. Vous devez également développer le programme Hadoop map/reduce en question.
Objectifs 6
Informations 7 Vous n'avez pas à développer le formulaire de sélection de la période de temps. Il n'est pas nécessaire non plus de s'occuper de la partie installation/alimentation de la base de données. On imagine donc que votre tâche débute à la réception des deux identifiants id_min et id_max; dans cette mise en situation, ils seraient typiquement passés à votre application par le formulaire en question (via un appel au script). Le développement du script d'exécution lui-même est optionnel (pour des points bonus en plus); votre tâche consiste à développer le programme map/reduce, et à créer deux commandes Sqoop lui correspondant: une pour l'import des tweets sur HDFS et l'autre pour l'export des résultats sur MySQL.
Machine virtuelle 8 La machine virtuelle associée au TP contient d'ores et déjà: Hadoop/HDFS, la base de données MySQL, Sqoop, et les données relatives au TP lui-même. Deux tunnels devraient normalement déjà être configurés sur la machine virtuelle: Le premier pour SSH, sur le port 2222. Il vous est ainsi possible d'accéder à la console via PuTTY/autre client SSH en vous connectant sur 127.0.0.1:2222. Le second pour un serveur web tournant également sur la machine, sur le port 8888. Son but essentiel est de vous permettre d'accéder à une interface PHPMyAdmin si vous le souhaitez, à l'adresse: http://127.0.0.1:8888/phpmyadmin/
Machine virtuelle 9 Les informations de connexion à la base de données MySQL: Serveur: localhost Login: hadoop Mot de passe: mbds Base de données: hadoop Vous pouvez accéder à la base pour analyser la structure des tables par le biais de PHPMyAdmin (voir slide précédente), ou simplement depuis la console par le biais du client MySQL CLI, avec la commande: mysql -u hadoop -pmbds hadoop (tapez ensuite vos requêtes, par exemple «desc tweets;».
Machine virtuelle 10 Toutes les commandes sont à taper via l'utilisateur système hadoop. Au sein du répertoire home de cet utilisateur (/home/hadoop), un répertoire big_data_hadoop_tp_3 contient les fichiers suivants: wordlist_bad.txt: les mot-clefs désignant un tweet comme «négatif». wordlist_good.txt: les mot-clefs désignant un tweet comme «positif». tweets_import.sql: les requêtes ayant permis de créer la base de données (normalement, n'est pas utile). examples/: les codes sources des programmes Anagrammes et WordCount des précédents TPs pour vous aider si nécessaire; également présents sous forme déjà compilée.
Analyse d'opinion 11 Votre tâche map/reduce doit analyser les tweets et en sortir quatre compteurs: Un nombre de tweets négatifs. Un nombre de tweets positifs. Un nombre de tweets inconcluants. Un nombre de tweets neutres. Comme indiqué plus haut, on se sert d'une liste de mot-clefs pour déterminer si un tweet est positif ou négatif. Il s'agit évidemment là d'une approche basique (qui ne suffirait pas dans un cas réel), mais elle suffit dans le cadre de ce TP. De même, la quantité de tweets est faible (< 500), là aussi pour des raisons de simplicité et de rapidité d'exécution.
Analyse d'opinion 12 Un tweet doit être considéré comme: Positif s'il contient au moins un mot clef de la liste des mot-clefs positifs (wordlist_good.txt), et aucun de la liste des mot-clefs négatifs. Négatif s'il contient au moins un mot clef de la liste des mot-clefs négatifs (wordlist_bad.txt), et aucun de la liste des mot-clefs positifs. Inconcluant s'il contient au moins un mot des deux listes, positives et négatives (par exemple «excellent» et «lamentable»). Neutre s'il ne contient aucun mot d'aucune des deux listes négatives et positives. Il n'est pas nécessaire de retenir quels sont les mots rencontrés; on cherche uniquement à l'issue du programme map/reduce à avoir les quatres compteurs déjà mentionnés précédemment, et à les importer dans la table results.
Structure des tables 13 La table finale results est constituée de deux champs: opinion, un champs texte qui doit prendre pour valeur «positif», «negatif», «neutre» ou «inconcluant». amount, un champs numérique qui doit prendre pour valeur le compteur correspondant. La table d'entrée tweets est constituée de quatre champs: id, une clef unique numérique (sur laquelle s'applique la restriction id_min/id_max). author, un champs texte contenant l'auteur du tweet. tweet, un champs texte contenant le tweet lui-même. postdate, un champs texte contenant la date où le tweet a été posté.
Rendu du TP 14 A l'issu du TP, vous devrez rendre: Le code source de votre programme Hadoop map/reduce, en Java ou autre langage de programmation (via l'utilitaire streaming). Les deux commandes Sqoop d'import des données initiales et d'export des résultats. D'éventuelles remarques associées à leur exécution si nécessaire. Pour avoir tous les points, votre programme devra s'exécuter et effectuer le travail demandé. Pour des points en plus, vous pouvez également développer le script bash permettant l'automatisation de l'exécution de toutes ces étapes (voir plus loin). Rendez votre travail par e-mail (ben@tokidev.fr).
Remarques 15 Lors de l'analyse des tweets, pensez à d'éventuelles contraintes liées aux espaces / délimiteurs de mots. Tous les champs de la base d'entrée ne sont pas forcément à utiliser! Vous pouvez filtrer ceux qui ne vous intéressent pas via l'import Sqoop, ou bien au sein de votre programme map/reduce (la première solution est recommandée). Pour vous aider, inspirez-vous des exemples des TPs précédents. Vous avez évidemment le droit de consulter toute documentation utile en ligne; notamment pour ce qui touche au parsing de chaîne de caractères en Java (analyse des tweets).
Remarques 16 Si vous ne souhaitez pas utiliser la machine virtuelle mais votre propre machine, une archive contenant les fichiers du répertoire big_data_hadoop_tp_3 est disponible à l'adresse: http://cours.tokidev.fr/bigdata/tp/big_data_hadoop_tp_3.zip Rappel: pour compiler votre programme, deux possibilités: Via Eclipse/Netbeans (pensez à inclure les librairies Hadoop). Manuellement, en faisant par exemple (ajustez le nom du package en conséquence): javac *.java mkdir -p org/mbds/hadoop/tp3 mv *.class org/mbds/hadoop/tp3 jar -cvf mbds_tp3.jar -C. org
Bonus: script d'automatisation 17 Pour (quelques) points en plus, rédigez un petit script bash qui automatise toutes ces opérations. Il devra prendre deux arguments: id_min et id_max (accessible dans bash via les variables $1 et $2), de sorte qu'en appelant par exemple:./opinion.sh 20 200 toutes les opérations s'exécutent pour les tweets entre 20 et 200 et les résultats finaux soient importés au sein de la table results.