Département Génie Informatique / École Supérieure Polytechnique /
UCAD
Big Data
TP N° 1 : Le traitement Batch avec
Hadoop, HDFS et MapReduce
Préparé par : Professeur :
Modou Fall Mr Ba
Premiere partie : Mise en place de l’environnement Hadoop
Travail 📝 à réaliser:
Le but de cette première partie est de définir un mini-cluster composé de 3 machines qui sont
hébergées chacune dans un conteneur docker : une machine Master et deux machines
Slave. Ces machines seront reliées par un réseau que nous appellerons Hadoop qui
va leur permettre de communiquer
1. Installation de docker
● Rendez vous sur https://hub.docker.com/
● Telecharger Docker et installez-le suivant votre SE
● une fois Docker installé nous pouvons les commandes de
docker 2. Chargement de l’image liliasfaxi/spark-hadoop:hv-2.7.2
3. Création des containers
Comme expliqué, nous visons la création d'un mini-cluster, contenant un
master qui sera notre namenode et deux slaves qui représenteront nos data
nodes. Pour se faire, suivez les étapes suivantes
❖ Créer un réseau qui permettra de relier les trois conteneurs:
❖ Créer et lancer les trois containers
4. Entrer le container Master pour commencer à l'utiliser.
Deuxième partie : Premiers pas avec Hadoop
A. Manipulation des fichiers
● Créer un répertoire dans HDFS, appelé input. Pour cela, taper:
● Nous allons utiliser le fichier purchases.txt comme entrée pour le
traitement MapReduce.
B. Interfaces web pour Hadoop
Haddop nous présente plusieurs interfaces
Avec l’adresse : http://localhost:50070
Avec l’adresse : http://localhost:8088
Troisième partie : Mapreduce avec java
Le but de cette troisième partie est de créer un job map reduce sur notre cluster de containers.
Un job mapreduce se compose principalement de deux types de programmes: - mappers :
permettent d'extraire les données nécessaires sous forme de clef/valeur, pour pouvoir ensuite
les trier selon la clef- 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... )
Total Vente :
Nous allons tester un programme de Mapreduce grâce à un exemple simple 🙂
● L'étape de mapping, qui permet de découper le texte en mots et de délivrer en sortie
un flux textuel, ou chaque ligne contient le magasin trouvé et le prix du produit vendu
● L'etape du reducing, qui permet de faire la somme des prix des produits pour chaque
magasin
A. Creation d’un projet intel ji
● Ouvrir le fichier pom. Xml, et ajouter les dépendances suivantes pour hadoop, hdfs et
mapreduce
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
<!--
https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core
-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.9</version>
</dependency>
</dependencies>
● TokenizerMapper
package hadoop.mapreduce.mfdev;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import java.util.StringTokenizer;
public class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Mapper.Context context
) throws IOException, InterruptedException {
// StringTokenizer itr = new StringTokenizer(value.toString());
String[] line = value.toString().split(" ");
word.set(line[2]);
one.set((int) Float.parseFloat(line[4]));
context.write(word, one);
}
}
● IntSumReducer
package hadoop.mapreduce.mfdev;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
// System.out.println("value: "+val.get());
sum += val.get();
}
System.out.println(key.toString()+" : "+sum);
result.set(sum);
context.write(key, result);
}
}
● TotalSummer
package hadoop.mapreduce.mfdev;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
// System.out.println("value: "+val.get());
sum += val.get();
}
System.out.println(key.toString()+" : "+sum);
result.set(sum);
context.write(key, result);
}
}
● Tester Mapreduce en Local En sortie nous avons les résultats suivants 👉
● Lancer le cluster mapreduce 🏌:
● Générer le fichier jar
● copier le fichier jar dans hadoop-master
● Revenir au shell du conteneur master, et lancer le job map reduce