Tutoriel MapReduce

Si comme moi vous avez lu de nombreux articles d’introduction ou de stratégie sur le Big Data, vous avez peut-être envie d’une approche plus concrète. Ce tutoriel se propose de vous montrer comment développer un programme MapReduce très simple pour analyser des données stockées sur HDFS.

Tutoriel : Développer un programme MapReduce sur une VM Hadoop

Nous allons reprendre les choses au début avec un traitement « bas niveau » directement sur MapReduce.
Même si on ne rentre pas dans ces détails de développement sur un vrai projet Big Data, cela nous permettra de bien comprendre la mécanique structurelle des traitements sur Hadoop.

Ce tutoriel s’appuie sur une VM mise à disposition par une distribution open-source.
Nous prendrons ensuite des données fournies par le site GitHub afin d’analyser des températures et calculer les maximales par année.
Pour cela votre portable suffit (avec de préférence 8 Go de mémoire).

Si vous souhaitez aller plus loin, vous pourrez lire le guide « HADOOP – The Definitive Guide – 4th Edition » de Tom White, qui m’a très largement inspiré.

Hadoop_definitive_guide

Installation d’une VM Hadoop

Vous aurez besoin d’une VM pour ce suivre ce tutoriel.

Pour ma part, j’ai choisi celle de Cloudera, que vous pouvez télécharger avec le lien suivant : QuickStart VMs for CDH 5.4.x .

cloudera_home

Pour compléter la mise en place, je vous propose les paramétrages suivants :

  • user « cloudera » (répertoire /home/cloudera),
  • répertoire partagé avec le host, afin d’y installer les exemples :
    mount -t vmhgfs .host:/ /home/cloudera/shares (avec le user root),
  • installation des exemples du Guide dans le répertoire
    home/cloudera/shares/samples/hadoop-book-master
    à partir du site web GitHub Hadoop Book (bouton « Download ZIP »),
  • variables d’environnement :
    export HADOOP_HOME=/usr/lib/hadoop,
    export PATH=.:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin.

 

Les (presque) Big Data

hadoop-hdfs

Il nous faut maintenant copier des fichiers de données dans hdfs :

  • le fichier hadoop-book-master/input/ncdc/sample.txt dans le répertoire input/ncdc,
  • les fichiers hadoop-book-master/input/ncdc/all/1901.gz et 1902.gz dans le répertoire input/ncdc/all.

Les commandes Hadoop à utiliser pour cela sont les suivantes :

hadoop fs -mkdir -p répertoire
hadoop fs -copyFromLocal fichiers_sources répertoire_cible
hadoop fs -ls répertoire
hadoop fs -cat fichier

 

Et voilà, vous êtes prêt à analyser les relevés des stations météo pour obtenir les températures maximales par année.


Commençons avec Python

python

Vous allez écrire vous-même le programme MapReduce en découpant les 2 phases map et reduce.

500px-Mapreduce

Ils pourront être testés d’abord hors Hadoop en utilisant des pipes Unix, puis dans Hadoop en utilisant le « streaming ».

max_temperature_map.py

Pour chaque ligne de notre fichier source, on extrait l’année, la température et le code qualité d’après leurs positions.
Si les données sont valides, on renvoie l’année et la température séparées par une tabulation.

#!/usr/bin/env python
  import re
  import sys
  for line in sys.stdin:
  val = line.strip()
 (year, temp, q) = (val[15:19], val[87:92], val[92:93])
 if (temp != "+9999" and re.match("[01459]", q)):
 print "%s\t%s" % (year, temp)

 

Testons ce programme hors Hadoop :

cat sample.txt | ./max_temperature_map.py (ajuster les répertoires)

 

Voici le fichier source :

0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999 0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+00221+99999999999 0043011990999991950051518004+68750+023550FM-12+038299999V0203201N00261220001CN9999999N9-00111+99999999999 0043012650999991949032412004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+01111+99999999999 0043012650999991949032418004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+00781+99999999999

 

Et le résultat obtenu :

1950          +0000
1950          +0022
1950          -0011
1949          +0111
1949          +0078

max_temperature_reduce.py

Pour chaque ligne renvoyée par le programme map, on extrait l’année et la température.
Pour chaque année, on recherche la température maximale et on renvoie ces 2 informations séparées par une tabulation.

#!/usr/bin/env python
  import sys
  (last_key, max_val) = (None, -sys.maxint)
  for line in sys.stdin:
 (key, val) = line.strip().split("\t")
 if last_key and last_key != key:
 print "%s\t%s" % (last_key, max_val)
 (last_key, max_val) = (key, int(val))
 else:
 (last_key, max_val) = (key, max(max_val, int(val)))
 if last_key:
 print "%s\t%s" % (last_key, max_val)

Test hors Hadoop

Testons maintenant ces 2 programmes, toujours hors Hadoop :

cat sample.txt | ./max_temperature_map.py | sort | ./max_temperature_reduce.py

 

Voici donc notre résultat final (température maximale par année) :

1949          111
1950           22

Exécution sur Hadoop

La fonction Hadoop Streaming permet d’interfacer Hadoop avec des programmes écrits dans un langage qui lit et écrit sur les entrées standards d’Unix, par exemple Python.

Il nous faut lancer la commande suivante :

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming-*.jar \
  -input input/ncdc/sample.txt \
  -output output \
  -mapper /home/cloudera/shares/samples/max_temperature_map.py \
  -reducer /home/cloudera/shares/samples/max_temperature_reduce.py

 

Vous noterez qu’il n’y a pas de fonction de tri, le framework Hadoop s’en charge.

hdfs_execution

 

Le résultat est dans le répertoire output sous HDFS :

hadoop fs -ls output
-rw-r--r--   1 cloudera cloudera         0 2015-06-23 11:19 output/_SUCCESS
-rw-r--r--   1 cloudera cloudera         17 2015-06-23 11:19 output/part-00000

 

hadoop fs -cat output/part-00000
1949          111
1950          22

Essayons maintenant en Java

java

Pas de panique, les exemples téléchargés précédemment contiennent tous les éléments pour réaliser notre programme MapReduce en Java.

Le code source se cache dans le répertoire hadoop-book-master/ch02-mr-intro/src/main/java, le tout est déjà compilé et packagé dans hadoop-book-master/hadoop-examples.jar.

Il ne vous reste qu’à lancer l’exécution :

  • cd /home/cloudera/shares/samples/hadoop-book-master
  • export HADOOP_CLASSPATH=hadoop-examples.jar
  • hadoop fs -rm -r output
  • hadoop MaxTemperature input/ncdc/sample.txt output

 

Sans surprise, nous obtenons le même résultat qu’en Python :

1949          111
1950          22

 

Suivi des traitements

Hadoop fournit une interface Web pour le suivi les traitements. Nous allons nous en servir pour suivre notre traitement MapReduce.

Pour y accéder dans la VM Cloudera, le lien est http://quickstart.cloudera:8088/cluster :

yarn_admin4

Si ce tutoriel vous a intéressé, vous pouvez poursuivre avec cet article « Spécial Tutoriels ».

 

Il n'existe pas de commentaire pour le moment.

Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*