Vous êtes sur la page 1sur 6

Travaux Dirigés no1

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/

x Exercice 1. Installer Hadoop sur votre machine

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à.

2. Créez un nouveau répertoire bigdata avec la commande mkdir bigdata .


Puis, tapez la commande ls pour lister le contenu du répertoire dans lequel
vous vous trouvez et vérifiez que votre répertoire bigdata apparaı̂t parmi la liste
des fichiers.

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 .

4. En utilisant un explorateur web, navigez sur la page web du projet Apache


Hadoop(1) , et téléchargez la dernière version stable de Hadoop (hadoop-3.1.2)
dans le répertoire qui contient votre fichier README.

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 .

6. Pour pouvoir utiliser hadoop facilement, exécutez les commandes suivantes.


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export HADOOP_HOME=$HOME/bigdata/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

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.)

7. Vérifiez que Hadoop est fonctionnel en lançant la commande hadoop version.

x Exercice 2. Map/Reduce (sans Hadoop)

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.

• Dans le sous-répertoire src/, deux scripts Python (mapper0.py, et reducer0.py).


Ces deux scripts décrivent une première implémentation MapReduce du pro-
gramme WordCount qui permet de compter le nombre d’occurrences de chaque
mot dans un fichier texte.

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).

2. Vérifiez que le mapper produit le résultat que vous attendez en exécutant la


commande suivante depuis votre répertoire bigdata

cat data/lesmiserables500.txt | src/mapper0.py

À quoi sert le caractère ’|’ (pipe)?


Essayez aussi la commande

cat data/lesmiserables500.txt | src/mapper0.py | sort

Quel rôle joue le mot clé sort?

3. Exécutez maintenant la commande complète

cat data/lesmiserables500.txt | src/mapper0.py | sort | src/reducer0.py

et vérifiez que le programme produit le résultat attendu. Si ça fonctionne,


félicitations! Vous venez d’exécuter votre premier programme Map/Reduce en
utilisant propre implémentation de Map/Reduce (en ligne de commande).

4. Testez la performance de cette approche sur l’intégralité du texte de Victor Hugo


en utilisant la commande time. Attention, afficher les résultat à l’écran prend du
temps, redirigez la sortie de votre programme vers un fichier texte avec l’opérateur
de redirection ’>’ suivit d’un nom de fichier. Voyez l’exemple ci-dessous.

time cat data/lesmiserables.txt | src/mapper0.py | sort | src/reducer0.py > out.


txt

x Exercice 3. Exécution de WordCount en Map/Reduce avec Hadoop


Normalement, les Mapper et les Reducer sont programmés directement en utilisant
l’API Java de Hadoop. Hadoop Streaming permet d’exécuter des mapper et des reducer
écrit dans n’importe quel langage. C’est ce que nous allons utiliser dans cet exercice
pour exécuter nos scripts mapper0.py et reducer0.py

1. Exécutez la commande suivante.

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.

Et vérifiez dans le repertoire output/ que la commande produit bien le résultat


attendu.

2. Repérez les statistiques Map/Reduce dans le résultat de vôtre exécution et trouvez


les champs Map input records et Map output records. À quoi correspondent
ces champs? À quoi correspondent leur valeur dans le cas de WordCount? Même
question pour Reduce input records et Reduce output records.

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?

4. Cette solution est-elle entièrement satisfaisante? Pourquoi?

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.

x Exercice 4. Temps de consultation moyen avec Map/Reduce

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.

1. Écrivez un programme Map/Reduce (sans combiner) pour faire cette opération

2. Pourquoi ne pouvez-vous pas utliser le Reducer comme Combiner pour optimiser


cette opération? Proposez un Combiner qui permet d’optimiser l’opération.

x Exercice 5. Requêtes SQL en MapReduce


Dans cet exercice, vous allez utiliser MapReduce et Hadoop pour effectuer des requêtes
sur une base de données stockée sous forme de fichiers. La base de donnée est composée
de deux tables: une table Customer et une table Order.

• Customer(id, startDate, nom)

• Order(#id, total)

Téléchargez les deux fichiers exemples Order.dat et Customer.dat sur la page Web
du TD.

1. On souhaite écrire un programme MapReduce équivalent à la requête SQL suiv-


ante.

Requête R0
-- Les identifiants des commandes ayant un total > 1000 --
SELECT o.id
FROM order o
WHERE o.total > 1000;

i. A-t’on besoin d’un Mapper? D’un Reducer?


ii. Déterminer le type d’entrée (clé, valeur) et de sortie (clé, valeur) pour
chacun des composants nécessaires.

2. En s’inspirant du WordCount, écrire un programme MapReduce équivalent à la


requête R0 . Exécuter le programme sur la base de donnée générée lors de la
question précédente, et vérifier les résultats.

3. Créer une copie du programme et le modifier pour répondre à la R1 .


-- Les identifiants des commandes ayant un total > 1000 (sans doublons) --
SELECT DISTINCT o.id
FROM order o
WHERE o.total > 1000;

(a) A-t’on besoin d’un Mapper? D’un Reducer?

5
(b) Déterminer le type d’entrée (clé, valeur) et de sortie (clé, valeur) pour chacun
des composants nécessaires.

4. L’exécution de ce programme peut être rendue plus efficace grâce à l’utilisation


d’un Combiner. Quel combiner doit-on utiliser ici? Quel sera son effet lors de
l’exécution du programme sur un cluster.

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).

6. Transcrire les requêtes suivantes en MapReduce. Pour chaque requête, proposer


au moins une version de base et une version plus efficace.

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;

Vous aimerez peut-être aussi