Hadoop / Big Data Benjamin Renaut <renaut.benjamin@tokidev.fr> MBDS 2014-2015
TP 1 - Correction Méthodologie Map/Reduce - programmation Hadoop.
Rappel 1 La première partie du TP consistait à mettre en place l'environnement pour ce TP et les prochains (machine virtuelle). Le sujet en lui-même consistait à concevoir un algorithme en utilisant la méthodologie map/reduce pour détecter et extraire tous les anagrammes à partir d'une liste de mots «communs» de la langue Anglaise. Il était aussi nécessaire d'implémenter cet algorithme pour qu'il soit exécutable via Hadoop soit en utilisant l'api Java «standard», soit via un autre langage de programmation en utilisant l'outil streaming de Hadoop (au choix).
Anagrammes 2 Comme indiqué dans le cours, le point central de ce genre de problèmes dans la méthodologie map/reduce pour trouver une solution optimale consiste à déterminer la clef à utiliser. Ici, on cherche à trouver des anagrammes. Une bonne question à se poser est donc: «Quel est le point commun entre deux mots qui sont des anagrammes?» - il s'agit des lettres des mots elles-même. Par conséquent, une clef idéale serait constituée de ces lettres. On a par ailleurs besoin, lors de l'étape intermédiaire de groupement/shuffle, que deux couples (clef;valeur) correspondant à un même anagramme soit groupés ensemble; autrement dit, que leur clef soit identique. Une bonne manière d'accomplir cet objectif serait de trier les lettres de la clef par ordre alphabétique: si on a deux mots «lemon» et «melon» (qui sont des anagrammes), on aura alors pour les deux une clef identique «elmno».
Anagrammes - MAP 3 Le code source de notre opération map consistera donc à: Générer une chaîne de caractères à partir du mot reçu en entrée de l'opération map; contenant toutes les lettres de ce mot, mais triées dans l'ordre alphabétique. Renvoyer un couple (clef;valeur), ayant pour clef cette chaîne de caractère et pour valeur le mot reçu en entrée de l'opération map. Cette opération est simple et générera par exemple, pour reprendre l'exemple précédent des deux mots «lemon» et «melon», les deux couples (clef;valeur): ("elmno", "lemon") et ("elmno", "melon")
Anagrammes - REDUCE 4 Quand à notre opération REDUCE, elle recevra en entrée les couples (clef;valeur) issus de l'opération MAP, groupés par clef distincte. Dans le cadre de l'api Java, cela se traduit par une clef unique: la clef distincte, ainsi qu'un objet Iterable de toutes les valeurs rencontrées correspondant à cette clef. Notre opération REDUCE est encore plus simple et devra simplement: Itérer sur chacune de ces valeurs, et la rajouter au sein d'une chaîne de caractères (en plaçant par exemple une virgule entre chacune des valeurs). Renvoyer un couple (clef;valeur) unique: la clef distincte reçue en entrée pour clef, et la chaîne de caractères ainsi générée pour valeur. Pour reprendre le même exemple, on recevrait ainsi en entrée la clef distincte «elmno» et un iterable contenant «lemon» et «melon», et on générerait: ("elmno", "lemon,melon")
Solution Java & Python 5 Le code source des classes Driver, MAP et REDUCE de la solution Java est disponible au sein des fichiers joints à cette correction, respectivement: Anagrammes.java AnagrammesMap.java et AnagrammesReduce.java Le code source des scripts MAP et REDUCE de la solution Python (à utiliser avec l'utilitaire streaming) est disponible au sein des mêmes fichiers, respectivement: anagrammes_map.py anagrammes_reduce.py
Autres remarques - PuTTY 6 Comme la machine virtuelle n'offre qu'une interface limitée, il est fortement recommandé de définir un port forwarding au sein de VirtualBox, entre le port hôte 2222 et le port 22 de la machine virtuelle. Cette redirection de port permettra de se connecter en SSH au système de la machine virtuelle, et ainsi d'avoir accés à une interface permettant la remontée dans l'historique, le copier-coller, etc. Pour se connecter une fois la redirection de port en place, il suffit de lancer PuTTY (sous Windows), et de se connecter à l'ip «127.0.0.1» et au port «2222». Sous Mac OS X ou Linux, on utilisera directement la commande ssh dans le terminal: ssh -p 2222 mbds@127.0.0.1
Autres remarques Eclipse & Netbeans 7 S'il est important de compiler manuellement au moins une fois un programme Hadoop, certains d'entre vous souhaitent probablement utiliser un IDE Java (par exemple Netbeans ou Eclipse) dans leur environnement habituel. Cela est possible: il vous suffit de télécharger les différentes librairies Java Hadoop (soit depuis la machine virtuelle dans /usr/share/local/hadoop, soit depuis le site officiel de Hadoop). Il suffit alors de les inclure dans un projet Java «standard», et de bien préciser à l'ide que ce projet doit compiler un.jar. Une fois la compilation effectuée, il faudra ensuite copier le fichier résultant sur la machine virtuelle pour le tester; pour ce faire, vous pouvez par exemple utiliser WinSCP (connexion à 127.0.0.1, port 2222): http://winscp.net/
Conclusion 8 Ce TP a permis la mise en place de l'environnement qui sera utilisé pour tous les TPs ultérieurs; il vous a par ailleurs permis de vous familiariser avec l'utilisation de Hadoop depuis la console. Il a par ailleurs poussé à la résolution d'un problème Hadoop légèrement plus complexe que celui vu en exemple en cours, et son implémentation logicielle et exécution sur Hadoop. La résolution d'un autre problème map/reduce, légèrement plus complexe et surtout plus «réaliste», constitue le sujet du TP 2.