Versions
23/11/2015 : création
Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
Hadoop, aide mémoire, les bases
Introduction
Hadoop est un ensemble d'outils permettant notamment de lancer des map reduce sur des clusteurs géants (plusieurs milliers de machines). Hadoop gère tous les problèmes de pannes matérielles, répartition des traitements sur les noeuds,...
HDFS (Hadoop Distributed File System) est la brique de base de Hadoop. C'est un système de fichier distribué.
Map/Reduce est une technique pour paralléliser des traitements sur un cluster. Ca n'est pas spécifique à Hadoop (on peut lancer des map/reduce dans mongoDb par exemple).
Cette page recense quelques commandes usuelles autour de Hadoop / HDFS et Map Reduce.
Installer Hadoop et map reduce
Le moyen le plus simple d'installer hadoop est docker. Je vous propose un docker qui installe une instance simple d'hadoop sur votre poste.
https://github.com/kibatic/docker-single-node-hadoop
Je vous laisse suivre le readme pour installer votre instance.
HDFS, Hadoop Distributed File System
Commandes de base de HDFS
# Créer un répertoire dans hdfs hdfs dfs -mkdir /mon_repertoire # lire le contenu d'un répertoire hdfs dfs -ls /mon_repertoire # envoyer plusieurs fichiers dans /mon_repertoire hdfs dfs -put my_files*.txt /mon_repertoire # récupérer un fichier dans hdfs hdfs dfs -get /mon_repertoire/output/part-00000 ma_sortie.txt # effacer un ou plusieurs fichiers hdfs dfs -rm /mon_repertoire/my_files* # lire le contenu d'un fichier hdfs dfs -cat /mon_repertoire/my_file1.txt
Map Reduce
Principe (en très rapide)
2 étapes :
- le mapper qui transforme les données d'entrée en clé/valeur et peut commencer des traitements, tant que ces traitements peuvent s'appliquer en parallèle sans avoir accès à l'ensemble des données
- le reducer prend les sorties des mappers, classées par clé (classement fait par hadoop) et fait les traitements qui vont bien pour sortir le résultat attendu.
Un exemple
On veut compter le nombre d'occurences de chaque mot du "Discours sur la paix" de Prévert :
fichier.txt
Vers la fin d’un discours extrêmement important le grand homme d’État, trébuchant sur une belle phrase creuse tombe dedans et désemparé, la bouche grande ouverte, haletant, montre les dents et la carie dentaire de ses pacifiques raisonnements met à vif le nerf de la guerre : la délicate question d’argent.
Le mapper.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # module pour les io stdin stdout import sys # on sépare les mots, on utilise le mot comme clé et comme valeur, on met 1 for line in sys.stdin: # vire les retours à la ligne line = line.strip() # coupe le texte séparé par des espaces keys = line.split() # pour chaque mot, écrit une ligne avec le mot un tab et le compte : 1 for key in keys: print('%s\t1' % (key) )
Le reducer.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # ici, les clés en sortie du mapper ont été classées. Il n'y a plus qu'à # sommer les décomptes, et écrire le décompte à chaque changement # de clé. import sys last_key = False running_total = 0 for input_line in sys.stdin: # parse la ligne d'entrée input_line = input_line.strip() this_key, value = input_line.split("\t", 1) value = int(value) # à chaque fois qu'on a la même clé, on incrémente le compteur if last_key == this_key: running_total += value # si on change de clé, il faut sortir la clé précédente avec le total else: if last_key != False: print( "{0}\t{1}".format(last_key, running_total) ) running_total = value last_key = this_key # écrire le total de la dernière ligne du fichier print( "{0}\t{1}".format(last_key, running_total))
Debug d'un map reduce en python
Un map reduce lancé dans hadoop est très difficile à débugguer. Si le map reduce est codé dans python, on peut tester les scripts (sur des sources de données petites).
# lancer un map_reduce python hors hadoop cat fichier*.txt | ./mapper.py | sort | ./reducer.py
Lancer le map reduce dans hadoop
cd /example # copier les fichiers d'entrée dans hdfs hdfs dfs -mkdir /input hdfs dfs -put ./fichier.txt /input # lancer le map reduce hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar \ -input /input \ -output /output \ -mapper /example/mapper.py \ -reducer /example/reducer.py
Conclusion
Ce tuto s'est concentré sur une mise en place pratique en développement et les commandes de base.
N'hésitez pas à nous faire vos retours dans les commentaires.
Commentaires
Note : on ne peut plus ajouter de commentaire sur ce site