Big Data
—M2 – Apprentissage—
Les fichiers à télécharger pour ce TD se trouvent sur la page Web du TD, à l’adresse
suivante. http://www.lamsade.dauphine.fr/~bnegrevergne/ens/bigdata/
Hadoop ainsi que d’autres outils dont nous nous servirons pendant ce cours
s’utilisent en ligne de commande. Nous allons profiter de ce TD pour nous famil-
iariser avec le terminal et les outils en ligne de commande, ils vous seront indispensable
pour la suite de ce cours.
1. Ouvrez un terminal et tapez cd pour vous rendre dans votre répertoire home
si vous n’y êtes pas déjà.
3. Tapez la commande cd bigdata pour vous rendre dans le répertoire que vous
venez de créer. Utilisez la commande nano README pour lancer un éditeur
et éditer le (nouveau) fichier README.
Pour l’instant, renseignez simplement votre nom, puis sauvegardez le fichier avec
ctrl + O et quittez l’éditeur avec ctrl + X .
Attention à bien télécharger les fichiers binaires, et non pas les fichiers sources.
Note: vous pouvez télécharger un fichier directement dans votre terminal en
utilisant la commande wget url-du-fichier . (Pour obtenir l’url d’un
fichier, faites un clic droit sur un lien et cliquez sur copy link location ou
équivalent.)
(1)
http://hadoop.apache.org
1
5. Dans votre terminal, décompressez l’archive en utilisant la commande tar xzvf
hadoop-3.1.2.tar.gz. Si tout se passe bien la commande va extraire l’archive
et créer un nouveau répertoire hadoop-3.1.2 (vérifiez avec ls). Renommez le
nouveau répertoire hadoop avec la commande mv hadoop-3.1.2 hadoop .
Déterminez le sens de ces commandes. Note : Pour ne pas avoir à taper ces
commandes à chaque fois que vous lancez un terminal, vous devez mettre ces
commandes à la fin du fichier .bashrc, à la racine de votre compte. (Créer le
fichier .bashrc s’il n’existe pas.)
Dans cet exercice, vous allez vous familiariser avec le paradigme Map/Reduce en
exécutant une première tâche Map/Reduce programmée en Python. Pour exécuter la
tâche Map/Reduce, nous allons ”émuler” le comportement de Hadoop grâce aux outils
en ligne de commande, cela vous permettra de bien comprendre le rôle de Hadoop
dans le processus d’exécution des tâches Map/Reduce.
Note : Python est un langage très simple et vous n’aurez sans doute pas de
difficultés à l’utiliser si vous connaissez d’autres langages comme Java. Si vous avez
besoin d’aide, vous trouverez une documentation de prise en main rapide sur la page
web du TD (Voir le fichier python-quickstart.html).
Téléchargez l’archive ex2.tar.gz et décompressez la dans votre répertoire bigdata.
L’archive contient deux répertoires data et src.
• Dans le répertoire data, vous trouverez une fichier lesmiserables.txt, qui con-
tient la transcription intégrale des Misérables de Victor Hugo. Vous trouverez
également un fichier lesmiserables500.txt qui contient seulement 500 lignes
prises dans le corps du fichier précédent. Nous utiliserons ces fichiers texte comme
données à traiter.
2
1. Étudiez ces deux scripts attentivement, et déterminez avec précision le rôle de
mapper0.py, et celui de reducer0.py (donnez une définition des entrées attendues
et sorties produites par chaque fichier).
3
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-3.1.2.jar -input
data/lesmiserables.txt -output output/ -file src/mapper0.py -file src/
reducer0.py -mapper mapper0.py -reducer reducer0.py
Où:
• hadoop jar est la commande hadoop qui permet d’exécuter un fichier JAR
(Java archive)
• $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-3.1.2.jar
et le chemin vers le fichier JAR de Hadoop Streaming (livré avec Hadoop
par défaut)
• -input data/lesmiserables.txt spécifie le fichier à traiter.
• -output output/ permet de spécifier le nom du repertoire qui contiendra
les résultats.
Attention: ce repertoire ne doit pas exister, sinon Hadoop termine avec
une erreur. Vous devez donc supprimer ce repertoire après chaque exécution
de Hadoop.
• -file src/mapper0.py et -file src/reducer0.py permettent de spécifier
les fichiers du système de fichier local qui vont être utilisés par Hadoop (utile
pour une exécution sur un cluster).
• -mapper mapper0.py -reducer reducer0.py permettent de spécifie le
script mapper et le script reducer respectivement.
3. Modifier le Mapper pour faire une agrégation locale. C’est à dire, pour faire en
sorte que le mapper n’émette qu’une seule paire (word, n) lorsque le même mot
apparaı̂t n fois dans la même ligne (au lieu de n paires (word, 1)). Observez le
résultat de ce travail sur les statistique Map output records et Reduce input
records. Pourquoi ce changement est-il important?
5. Qu’est ce qu’un Combiner? Quel combiner pouvez vous utiliser pour diminuer
le nombre de paires qui transitent entre le mapper et le reducer. Testez votre
approche en utilisant l’option -combiner de Hadoop Streaming.
4
On dispose d’un fichier contenant sur chaque ligne l’URL d’une page consultée par
un utilisateur, ainsi que le temps que l’utilisateur à passé sur cette page. Téléchargez le
fichier exemple URLs.dat sur la page Web du TD. On souhaite calculer le temps moyen
passé sur chaque page.
• Order(#id, total)
Téléchargez les deux fichiers exemples Order.dat et Customer.dat sur la page Web
du TD.
Requête R0
-- Les identifiants des commandes ayant un total > 1000 --
SELECT o.id
FROM order o
WHERE o.total > 1000;
5
(b) Déterminer le type d’entrée (clé, valeur) et de sortie (clé, valeur) pour chacun
des composants nécessaires.
5. Sachant que vos programmes MapReduce sont pour l’instant exécutés sur une
seule machine (et non sur un véritable cluster) comment peut-on comparer les
performances des deux implémentations de la requête R1 ? (La réponse se trouve
dans les traces générées par Hadoop).
Requête R2
-- Nombre d’achat pour chaque mois --
SELECT MONTH(c.start_date), COUNT(*)
FROM customer c
GROUP BY MONTH(c.start_date)
Requête R3
-- Ensemble des enregistrements cliens triées par nom --
SELECT *
FROM customer c
ORDER BY c.name;
Requête R4
-- Ensemble des commandes avec le nom du client (jointure) --
SELECT c.name, o.total
FROM customer c, order o
WHERE c.id = order.id;
Requête R5
-- Montant moyen des commandes par client --
SELECT c.name, AVG(o.total)
FROM customer c, order o
WHERE c.id = o.id
GROUP BY c.name;