TP : Map Reduce & Hadoop
Apache Hadoop est un framework open-source pour stocker et traiter les données
volumineuses sur un cluster. Il est utilisé par un grand nombre de contributeurs et utilisateurs.
Il a une licence Apache 2.0.
Ce TP est inspiré de la formation “Intro to Hadoop and Map Reduce” fait par Cloudera et
publié sur Udacity. Ils fournissent une machine virtuelle où Hadoop, ainsi qu’un grand
nombre d’outils de son écosystème, sont préinstallés. (Visiter le lien
https://www.udacity.com/wiki/ud617)
I. Premiers pas avec Hadoop
La machine virtuelle «Cloudera-Udacity-Training-VM-4.1.1.c.zip » est téléchargée à partir de
la clé partagée pendant la séance, C'est une machine Linux, distribution CentOS.
Démarrer votre machine virtuelle et lancer un terminal
Sous le répertoire ~/udacity_training, vous trouverez deux sous-répertoires: code et
data dans lesquels on trouvera et on sauvegardera respectivement les codes de nos
mappers et reducers, et les données sources et résultat.
Déplacez-vous sous le répertoire ~/udacity_training/data, et vérifier que le fichier
purchases.txt existe bien.
Toutes les commandes interagissant avec le système Hadoop commencent par hadoop fs.
Ensuite, les options rajoutées sont très largement inspirées des commandes Unix standard.
Le tableau suivant résume les commandes les plus utilisées dans Hadoop:
hadoop fs –ls Afficher le contenu du répertoire racine
hadoop fs –put file.txt Upload un fichier dans hadoop (à partir du répertoire courant linux)
hadoop fs –get file.txt Download un fichier à partir de hadoop sur votre disque local
hadoop fs –tail file.txt Lire les dernières lignes du fichier
hadoop fs –cat file.txt Affiche tout le contenu du fichier
hadoop fs –mv file.txt Renommer le fichier
newfile.txt
hadoop fs –rm newfile.txt Supprimer le fichier
hadoop fs –mkdir myinput Créer un répertoire
hadoop fs –cat file.txt | less Lire le fichier page par page
Créer un répertoire dans HDFS, appelé myinput.
hadoop fs –mkdir myinput
Nawres Abdelwahed Page 1
Pour copier le fichier purchases.txt dans HDFS sous le répertoire myinput, taper la
commande:
hadoop fs –put purchases.txt myinput/
Pour afficher le contenu du répertoire myinput, la commande est:
hadoop fs –ls myinput
Pour visualiser les dernières lignes du fichier, taper:
hadoop fs –tail purchases.txt
On obtient alors
II. Map Reduce :
Map Reduce est un patron d’architecture de développement permettant de traiter les données
volumineuses de manière parallèle et distribuée. Il se compose principalement de deux types
de programmes:
Les Mappers : permettent d’extraire les données nécessaires sous forme de
clef/valeur, pour pouvoir ensuite les trier selon la clef
Les Reducers : prennent un ensemble de données triées selon leur clef, et effectuent le
traitement nécessaire sur ces données (somme, moyenne, total…)
Pour notre TP, nous utilisons le langage Python pour développer les Mappers et les Reducers.
Les traitements intermédiaires (comme le tri par exemple) sont effectués automatiquement par
Hadoop.
1- Mappers :
Soit un code comportant 6 champs, séparés par des tabulations. Le Mapper doit:
- Séparer les différents champs par tabulation
Nawres Abdelwahed Page 2
- Extraire les éléments voulus à partir de ces champs, sous forme de clef/valeur
Pour ce premier exercice, notre but est de déterminer le total des ventes par magasin, pour un
fichier log dont les champs sont de la forme suivante:
Date temps magasin produit coût paiement
Pour calculer les ventes par magasin, le couple (clef, valeur) à extraire est (magasin,coût).
Pour faire cela, le code du Mapper est le suivant :
def mapper():
for line in sys.stdin:
data = line.strip().split(“\t”)
if len(data) == 6:
date, time, store, item, cost, payment = data
print “{0}\t{1}”.format(store,cost)
Ce code se trouve sous le répertoire ~/udacity_training/code dans le fichier mapper.py.
To do 1 :
- Que permet de faire chaque ligne de ce code?
- Tester ce mapper en local sur les 50 premières lignes du fichier purchases.txt en tapant
l’instruction suivante, directement à partir de votre répertoire code:
head -50 ../data/purchases.txt | mapper.py
2- Reducer :
Dans l’exemple précédent, une fois que le Mapper extrait les couples (magasin, cout), le
Reducer aura comme tâche de faire la somme de tous les coûts pour un même magasin. Le
code du Reducer est le suivant :
def reducer():
salesTotal = 0
oldKey = None
for line in sys.stdin:
data = line.strip().split(“\t”)
if len(data) != 2:
continue
thisKey, thisSale = data
if oldKey and oldKey != thisKey:
print “{0}\t{1}”.format(oldKey,salesTotal)
salesTotal = 0
oldKey = thisKey
salesTotal += float (thisSale)
if oldKey != None:
print oldKey,“\t”, salesTotal
Nawres Abdelwahed Page 3
To do 2 :
- Expliquer ce code.
- Tester ce Reducer sur le disque local, en utilisant cette instruction.
head -50 ../data/purchases.txt |./mapper.py |sort |./reducer.py
3- Lancer un Job entier
Lancer un job entier sur Hadoop implique qu’on fera appel au mapper puis au reducer sur une
entrée volumineuse, et obtenir à la fin un résultat, directement sur HDFS. Pour faire cela,
l’instruction à exécuter est:
hadoop jar /usr/lib/hadoop-0.20-
mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-
cdh4.1.1.jar –mapper mapper.py –reducer reducer.py –file
mapper.py –file reducer.py –input myinput –output joboutput
Cette instruction donne en paramètres les fichiers correspondant aux Mappers et Reducers, et
les répertoires contenant le fichier d’entrée (myinput) et la sortie à générer (joboutput). Le
répertoire de sortie, après exécution, contiendra un fichier appelé part-00000, représentant la
sortie désirée.
Remarque : Le répertoire d’entrée doit contenir un seul fichier. Le répertoire de sortie ne doit
pas exister avant l’exécution de l’instruction.
Pour faciliter le travail, un raccourci a été créé pour cette instruction (vous le trouverez défini
dans le fichier ~/.bashrc). Désormais, pour exéuter cette instruction, il suffit de taper:
hs mapper.py reducer.py myinput joboutput
To do 3 :
- Exécuter un job hadoop sur le fichier purchases.txt en utilisant les fichiers mapper.py et
reducer.py déjà fournis. Stocker le résultat dans un répertoire joboutput. Sauvegarde ensuite le
fichier part-00000 dans votre répertoire local.
- Quelle est la totalité des ventes du magasin de Buffalo ?
To Do 4 :
Ecrire vos propres mappers et reducers pour :
Nawres Abdelwahed Page 4
1- Donner la liste des ventes par catégorie de produits (quelle est la valeur des ventes
pour la catégorie Toys).
2- Donner le montant de la vente le plus élevé pour chaque magasin
3- Quel est le nombre total des ventes et la valeur totale des ventes de tous magasins
confondus?
Nawres Abdelwahed Page 5