Nous allons parler dans ce billet d’Hadoop, le framework Java d’Apache en vogue pour le traitement de données très volumineuses (pouvant aller jusqu’à plusieurs pétaoctets). Ce framework implémente notamment sa propre version de l’algorithme MapReduce, qui a été instauré par Google.
- Le système de données distribué d’Hadoop : le HDFS
- l’algorithme de MapReduce dans Hadoop :
i. Le « Mapping » :
ii. Le « Reducing » :
Le traitement voulu est alors effectué, donnant l’output final :
- Un exemple de traitement de MapReduce avec Hadoop :
Traitement des données :
Le traitement que nous voulons faire est simple : nous voulons avoir le nombre de personnes par lettre de l’alphabet en Belgique. Pour ce faire, il suffit de créer une fonction Map et une fonction Reduce adaptée à nos besoins, et sous la bonne forme (clé,valeur), afin qu’Hadoop puisse alors effectuer le traitement.
Implémentation en Java des méthodes Map et Reduce :
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] tokens = value.toString().split(",");
String cle = tokens[0].substring(0,1);
int valeur = Integer.parseInt(tokens[1]);
context.write(new Text(cle), new IntWritable(valeur));
}
}
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException,InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
Nous pouvons maintenant exporter en un jar executable, qu’on va ensuite pouvoir lancer avec Hadoop. Mais tout d’abord, il faut que le fichier en entrée (pour nous la liste des prénoms et le nombre d’apparitions correspondantes) soit dans le HDFS. Pour ce faire, il suffit d’utiliser la gestion du HDFS par ligne de commande :
hadoop fs -mkdir /input hadoop fs -put /repertoire_local/noms_belges.csv /input
Nous pouvons alors éxécuter le jar via Hadoop, en demandant que le fichier de sortie soit crée dans le dossier output du HDFS, qui sera alors créé. Il suffit alors de récupérer ce fichier en local sachant que, par défaut, le fichier est nommé « part-r-00000 » :
hadoop jar /repertoire_local/exemple.jar /input/noms_belges.csv /output hadoop fs -get /output/part-r-00000 /repertoire_local_sortie
Voici un aperçu du fichier obtenu :
Nous avons donc pu voir les possibilités offertes par Hadoop pour le traitement distribué des données, et sa simplicité de mise en oeuvre.
Pour plus d’informations, vous pouvez consulter la documentation d’Apache, ou le très complet « Hadoop : The Definitive Guide« , de Tom White.
