Hadoop, doop, doop, doop…

Un billet qui propose même une version musicale : http://www.youtube.com/watch?v=LUm19zKdASY

Bon ok , je sors… :mrgreen:

Vous me direz, j’aurais pu faire pire et vous proposer une nouvelle version de « Oh chéri, chéri » de Karen Cheryl 😀 (désolé Fred… 😉 )

Pour être franc avec vous, j’ai longuement hésité avant de me lancer dans l’écriture de ce billet.

Le sujet est tellement vaste et les possibilités d’utilisation si nombreuses qu’il m’aurait fallu des pages et des pages pour en faire le tour (en plus je suis certain d’avoir un retour amusé de certaines personnes de mon entourage sur ce billet :-D)

Mais après tout, pourquoi pas ? Donc je vais l’aborder sans plonger dans les détails mais suffisamment, je pense, pour pouvoir vous amuser (c’est bien le but, non ? 😀 )

Hadoop, quoi que c’est ?

Pour citer Wikipédia :

« Hadoop est un framework java libre destiné aux applications distribués et à la gestion intensive des données. Il permet aux applications de travailler avec des milliers de nœuds et des pétaoctets de données. Hadoop a été inspiré par les publications MapReduce, GoogleFS et BigTable de Google. »

Parmi les éléments composant Hadoop, nous allons retrouver principalement:

HDFS (Hadoop Distributed File System), le système de fichiers distribués

MAPREDUCE , un framework pour les calculs parallèles et distribués

HBASE , la base de données distribuées

ZOOKEEPER , un service de centralisation pour coordonner les systèmes distribués

PIG , plateforme pour l’analyse d’un grand nombre de données

Vous l’avez compris, Hadoop sert principalement au traitement de gros volumes de données.

A cet effet, je vous invite à regarder la vidéo d’Olivier Grisel lors de sa présentation d’Hadoop et MapReduce a l’Open Source Developers Conference 2009 (vous retrouverez cette présentation ICI ).

Vous me direz « Oui mais bon, en quoi ça me concerne moi ??? ».

Tsss, petit scarabée, il n’y a pas si longtemps, dans une galaxie lointaine, vous stockiez l’intégralité de vos photos de vacances de votre vie sur un disque de 10 Go….

Aujourd’hui où le moindre APN bas de gamme prend une photo de 5 Mo, je vous laisse imaginer la volumétrie nécessaire pour stocker l’intégralité de vos clichés de vacances avec Tata Simone et surtout la cousine Juliette…

Bref, vous l’avez compris, la capacité des disques augmentent mais les vitesses de transfert, elles ne suivent pas.

En 1990, sur un disque de 1,4Go, avec un taux de transfert de 4,4 Mo/s, il vous fallait environ 5 minutes pour le lire entièrement. De nos jours, pour un disque d’1To, avec un taux de transfert de 100 Mo/sec, il vous faut presque 2h30 pour la même opération…

Diviser ces données sur 100 disques et, par cette lecture parallèle, toutes les données peuvent être lues en moins de 2 minutes.

Ceux qui utilisent le système RAID doivent comprendre 😉

Pour de plus amples détails, je vous invite a parcourir le Wiki Hadoop ou vous plonger dans l’excellent « Hadoop, The definitive Guide » chez O’Reilly .

Pour bien comprendre le fonctionnement d’Hadoop, comme toujours, un joli dessin pour tenter de conceptualiser le bouzin.

Il faut discerner tout d’abord la partie HDFS qui est le système de fichier distribué d’Hadoop, composé d’un serveur maître, le NameNode et de serveurs détenant les données proprement dites, les Datanodes.

Quand une application cliente a besoin d’accéder a une information, elle interroge le NameNode qui lui indique les Datanodes sur lesquels se trouve ces informations. Une fois en possession de cette liste, l’application cliente va directement interroger le(s) Datanodes.

Dans une architecture HDFS, un fichier est découpé en un ou plusieurs blocs et réparti sur les datanodes du cluster. De plus, chaque bloc est répliqué suivant le facteur de réplication que vous avez spécifié dans votre configuration.

Je ne vais pas vous expliquer en détails la façon dont est architecturé HDFS, je vous invite à lire cette page pour bien comprendre la structure :

http://hadoop.apache.org/common/docs/current/hdfs_design.html

Ensuite, par dessus HDFS, nous avons la partie moteur MAP/REDUCE avec un JobTracker, genre de centralisateur de tâches, et des TaskTracker qui se chargent d’executer les travaux demandés.

Le Client soumet la requète de travail au JobTracker qui va les transmettre au(x) TaskTracker concerné(s) en s’efforcant d’être au plus proche de la donnée.

Concernant MapReduce, son rôle consiste à diviser le traitement en 2 étapes :

  • la première phase (Map) est une étape d’ingestion et de transformation des données sous la forme de paires clé/valeur
  • la seconde phase (Reduce) est une étape de fusion des enregistrements par clé pour former le résultat final

Source : InternetCollaboratif
, sinon je vous invite à vous rendre sur cette page de Wikipédia qui vous donnera un peu plus d’explication sur son fonctionnement (inutile que je vous raconte la même chose 🙂 )

Sachez enfin qu’Hadoop est utilisé chez Yahoo!, Facebook, le New York Times, Last.fm etc… Bref, déjà bien éprouvé en production…

Bien, trêve de bavardage, attaquons nous a tout cela.

La société Cloudera propose sur son site une installation automatisée d’Hadoop, permettant de monter son cluster Hadoop en trois clics et configurable à souhait.

Excellente initiative qui mérite d’être saluée.

Mais bon, nous, on n’a pas peur, on est même plutôt « couillu » donc on va se la faire en mode installation a la mimine.

Pré-requis :

– Un JAVA 1.6 sur les serveurs : http://java.sun.com/javase/downloads/index.jsp

– Un utilisateur « hadoop » par exemple

– une paire de clés ssh privé/publique pour cet utilisateur afin de contrôler les noeuds du cluster

Téléchargez les sources sur : http://hadoop.apache.org/core/releases.html

tar xzvf hadoop-0.20.1.tar.gz
 
chown -R hadoop:hadoop hadoop-0.20.1
su - hadoop
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
ssh localhost (et sur les autres noeuds également)

Il existe 3 modes d’installation d’Hadoop :

  1. Mode StandAlone (local)
  2. Mode Pseudo-Distributed(chaque démon Hadoop est lancé dans un process Java indépendant)
  3. Mode Fully-Distributed (Cluster)

Bien évidemment, nous, même pas peur, on va se faire l’installation « Cluster ».

Pour ce billet, je vais partir sur un cluster de 4 machines comme décris dans le schéma plus haut.

Pour faciliter les tests, le NameNode sera également DataNode.

Un petit dessin reprenant le nom des machines et leurs rôles pour la suite :

Les fichiers de configurations se trouve dans.. conf.

Voici les principaux :

hadoop-env.sh         Variables d’environment utilisées par Hadoop
core-site.xml            Configuration principal (comme les paramètres I/O pour HDFS et MapReduce
hdfs-site.xml            Configuration des démons HDFS
mapred-site.xml      Configuration pour le démon MapReduce (jobtracker et les tasktrackers)
masters                   Liste des machines qui sont NameNode secondaire
slaves                      Liste des machines qui sont datanodes et tasktracker
Vous n’avez pas à spécifier le NameNode et le JobTracker dans le fichier « masters ».

Pour la partie HDFS, c’est en lançant le script start-dfs.sh sur la machine qu’elle va être désignée NameNode et executer le démarrage des datanodes listées dans le fichier « slaves ».

Idem pour la partie MapReduce et le script stop-mapred.sh.

Le premier a modifier est celui de l’environnement, puis le core-site.xml et le hdfs-site.xml pour la partie HDFS, enfin le maprep.xml pour la partie Mapreduce.

hadoop-env.sh

export JAVA_HOME=/opt/jdk1.6.0_16
 
# Taille mémoire allouée à chaque démon (ici 2Go)
 
export HADOOP_HEAPSIZE=2000
 
export HADOOP_LOG_DIR=/tmp

Il existe d’autres options que vous pouvez affiner.

core-site.xml

On définit l’URI du NameNode

 <property>
<name>fs.default.name</name>
<value>hdfs://guiguiabloc-namenode/</value>
</property>

hdfs-site.xml (HDFS)

<!--  ici le chemin local du filesystem où le NameNode stocke ses données -->
dfs.name.dir
/data/hdfs
 
<!--  ici le chemin local du filesystem où le DataNode stocke ses données -->
dfs.data.dir
/data/hdfs2

mapred-site.xml (MAPREDUCE)

Ici on spécifie le répertoire local qui servira a MapReduce pour écrire ses données temporaires.

Puis le répertoire système proprement dit (dans le filesystem HDFS)

mapred.job.tracker
guiguiabloc-jobtracker:8021
 
mapred.local.dir
/opt/mapred
 
mapred.system.dir
/hdfs/mapred/system
 
mapred.tasktracker.map.tasks.maximum
4

slaves

Ici nous spécifions tout les noeuds datanodes/tasktrackers

guiguiabloc-namenode
guiguiabloc-datanode-a
guiguiabloc-datanode-b

Commencons les joyeusetés :

On « formate » notre HDFS (sur guiguiabloc-namenode)

guiguiabloc-namenode:~$ bin/hadoop namenode -format
09/11/12 14:38:31 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = guiguiabloc-namenode/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.1
STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep  1 20:55:56 UTC 2009
************************************************************/
Re-format filesystem in /data/hdfs ? (Y or N) Y
09/11/12 14:38:33 INFO namenode.FSNamesystem: fsOwner=hadoop,hadoop
09/11/12 14:38:33 INFO namenode.FSNamesystem: supergroup=supergroup
09/11/12 14:38:33 INFO namenode.FSNamesystem: isPermissionEnabled=true
09/11/12 14:38:33 INFO common.Storage: Image file of size 96 saved in 0 seconds.
09/11/12 14:38:34 INFO common.Storage: Storage directory /data/hdfs has been successfully formatted.
09/11/12 14:38:34 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at guiguiabloc-namenode/127.0.1.1
************************************************************/

Puis on démarre le Namenode (qui se chargera de démarrer les datanodes)

$ bin/start-dfs.sh
starting namenode, logging to /tmp/hadoop-hadoop-namenode-guiguiabloc-namenode.out
guiguiabloc-namenode: starting datanode, logging to /tmp/hadoop-hadoop-datanode-guiguiabloc-namenode.out
guiguiabloc-datanode-b: starting datanode, logging to /tmp/hadoop-hadoop-datanode-guiguiabloc-datanode-b.out
guiguiabloc-datanode-a: starting datanode, logging to /tmp/hadoop-hadoop-datanode-guiguiabloc-datanode-a.out
localhost: starting secondarynamenode, logging to /tmp/hadoop-hadoop-secondarynamenode-guiguiabloc-namenode.out

Si tout se déroule correctement, vous devriez voir les noeuds esclaves démarrés :

2009-11-12 16:14:38,974 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting DataNode
STARTUP_MSG:   host = guiguiabloc-datanode-a/91.xx.xx.xx
STARTUP_MSG:   args = []
STARTUP_MSG:   version = 0.20.1
STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep  1 20:55:56 UTC 2009
************************************************************/
2009-11-12 16:14:39,297 INFO org.apache.hadoop.hdfs.server.common.Storage: Storage directory /data/hdfs is not formatted.
2009-11-12 16:14:39,297 INFO org.apache.hadoop.hdfs.server.common.Storage: Formatting ...
2009-11-12 16:14:40,062 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Registered FSDatasetStatusMBean
2009-11-12 16:14:40,065 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Opened info server at 50010
2009-11-12 16:14:40,068 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Balancing bandwith is 1048576 bytes/s
...

Il ne vous reste qu’a vous connecter sur l’interface http://guiguiabloc-namenode:50070 pour voir l’état de votrte cluster

Maintenant démarrons la partie MapReduce.

hadoop@guiguiabloc-jobtracker:~$ bin/start-mapred.sh
starting jobtracker, logging to /tmp/hadoop-hadoop-jobtracker-guiguiabloc-jobtracker.out
guiguiabloc-namenode: starting tasktracker, logging to /tmp/hadoop-hadoop-tasktracker-guiguiabloc-namenode.out
guiguiabloc-datanode-a: starting tasktracker, logging to /tmp/hadoop-hadoop-tasktracker-guiguiabloc-datanode-a.out
guiguiabloc-datanode-b: starting tasktracker, logging to /tmp/hadoop-hadoop-tasktracker-guiguiabloc-datanode-b.out

Idem les noeuds tasktracker démarrent également :

2009-11-12 16:58:09,822 INFO org.apache.hadoop.mapred.TaskTracker: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting TaskTracker
STARTUP_MSG:   host = guiguiabloc-datanode-b/91.xx.xx.xx
STARTUP_MSG:   args = []
STARTUP_MSG:   version = 0.20.1
STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.1-rc1 -r 810220; compiled by 'oom' on Tue Sep  1 20:55:56 UTC 2009
************************************************************/
...
2009-11-12 16:58:47,185 INFO org.apache.hadoop.ipc.Server: IPC Server handler 6 on 43676: starting
2009-11-12 16:58:47,185 INFO org.apache.hadoop.mapred.TaskTracker: TaskTracker up at: localhost/127.0.0.1:43676
2009-11-12 16:58:47,186 INFO org.apache.hadoop.mapred.TaskTracker: Starting tracker tracker_guiguiabloc-datanode-b:localhost/127.0.0.1:43676
2009-11-12 16:58:47,230 INFO org.apache.hadoop.ipc.Server: IPC Server handler 7 on 43676: starting
2009-11-12 16:58:47,238 INFO org.apache.hadoop.mapred.TaskTracker:  Using MemoryCalculatorPlugin : org.apache.hadoop.util.LinuxMemoryCalculatorPlugin@1af33d6
2009-11-12 16:58:47,241 WARN org.apache.hadoop.mapred.TaskTracker: TaskTracker's totalMemoryAllottedForTasks is -1. TaskMemoryManager is disabled.
2009-11-12 16:58:47,242 INFO org.apache.hadoop.mapred.IndexCache: IndexCache created with max memory = 10485760
2009-11-12 16:58:47,243 INFO org.apache.hadoop.mapred.TaskTracker: Starting thread: Map-events fetcher for all reduce tasks on tracker_guiguiabloc-datanode-b:localhost/127.0.0.1:43676

Vous pouvez vérifier l’état de l’ensemble en vous connectant sur http://guiguiabloc-jobtracker:50030

Une fois tout bien démarrer, il ne vous reste qu’a créer les accès pour les utilisateurs :

$ bin/hadoop fs -mkdir /user/username
$ bin/hadoop fs -chown username:username /user/username

Pour appliquer un quota d’ 1To a un user par exemple :

$ bin/hadoop dfsadmin -setSpaceQuota 1t /user/username

Des outils de Benchmark sont fournis avec, vous permettant de tester votre cluster :

Par exemple pour tester l’écriture de 10 fichiers de 1G

$ bin/hadoop jar /opt/hadoop/hadoop-0.20.1-test.jar TestDFSIO -write -nrFiles 10 -filesize 1000

Idem pour les Mapreduces

$ bin/hadoop jar /opt/hadoop/hadoop-0.20.1-examples.jar randomwriter random-data
$ bin/hadoop jar /opt/hadoop/hadoop-0.20.1-examples.jar sort random-data sorted-data
Running on 3 nodes to sort from hdfs://guiguiabloc-namenode/user/hadoop/random-data into hdfs://guiguiabloc-namenode/user/hadoop/sorted-data with 5 reduces.
Job started: Thu Nov 12 16:47:41 CET 2009

Dans votre interface d’administration, les Jobs s’afficheront avec le résultat.

Vous voilà désormais à la tête d’un joli cluster Hadoop qu’il est grand temps de mettre à contribution.

Je vous invite a lire les nombreux tuto qui existent sur le site d’Hadoop (http://hadoop.apache.org/common/docs/current/mapred_tutorial.html par exemple).

Voila pour cette première approche d’Hadoop, en espérant que cela à titiller votre envie d’en savoir plus sur cette architecture.

Bien évidemment, je n’ai fait qu’approcher le sujet, j’y reviendrais peut-être dans d’autres billets maitenant que notre architecture Hadoop est en place afin de vous montrer la formidable puissance de cet environnement.

Amusez-vous bien 🙂

Ce billet a été posté dans architecture, linux, sécurité et taggé , , . Bookmark ce permalink.

8 commentaires sur “Hadoop, doop, doop, doop…

  1. Salut,

    Encore bravo pour ton tutoriel tu vas réussir à me réconcilier avec ce FS.

    Ce FS je l’ai écarté pour la simple raison qu’il y a du Java. Ca parait con mais j’ai eu tellement de soucis avec des plateformes contenant du java chez mes clients (ils savaient sans doute pas coder) et les mauvaises impressions des softs comme OpenOffice que ca me rebute ne serait ce que de tester.

    Mais quand on voit les références qui l’utilisent je me dis qu’il doit bien dépoter quand même.

    Niveau performance, évolution (rajout de datanode), administration quotidienne tu en penses quoi?

    En fait j’ai eu quelques retours sur GlusterFS que j’avais choisi comme nouvelle base. Des personnes ont eu de sacrés crash et on vite eu du mal niveau administration alors que c’est à mon sens le fs qui s’installe et se déploie le plus vite.
    Du coup ca leur a ouvert les portes d’un financement d’un vrai SAN …

    Du coup je recommence à regarde ce qui se fait d’autre.

  2. merci 😀

    Tu es comme moi, un peu froid au début a cause de java et de mauvaises expériences, mais là, très agréablement surpris.

    Côté perf et administration, c’est un vrai plaisir, mais attention, il faut voir très large (pas la peine de partir sur 5 noeuds…). Pour une utilisation en Prod, je conseille de démarrer a 10 machines costaud. Les serveurs ne dorment pas mais les résultat est au rendez-vous, des vitesses de traitement et des retours bluffant (surtout quand on commence a taper dans Hbase et surtout Zookeeper).
    Bref, un excellent choix quand on a de très gros volumes de données a traiter.

    J’ai rapidement était échauder de GlusterFS, c’est amusant en maquette mais en prod, c’est désastreux malheureusement…

  3. Et pour partir uniquement sur du HDFS tu conseillerais quoi? Car 10 machines d’un coup ca enlève pas mal de projets.

    Peux tu me contacter par email aussi merci.

  4. Bonjour,
    J’envisage d’installer un Hadoop + Mahout pour faire de la classification automatique. Mais tu dis qu’il « faut voir très large », à partir de 10 serveurs, or je n’ai pas 10 serveurs… Idéalement, j’aimerais distribuer Hadoop et Mahout sur 2 serveurs (assez gros) qui gère déjà MySQL en master-master, mes autres serveurs gérant Apache, les backups…etc.
    Ça peut le faire tu crois avec 2 serveurs ?

  5. Bonjour,
    Honnetement, Hadoop sur 2 serveurs n’a strictement aucun interet (a part maquetter et encore…). Le minimum viable est de 5 machines (10 pour un environnement de production).
    Tourne toi plutot vers d’autres solutions.

  6. Ok merci pour ta réponse.
    En fait ce qui m’intéresse, c’est uniquement le système de catégorisation automatiquement de texte (naive bayesian filter). Et je n’ai pas trouvé d’autre outil open-source fiable et performant faisant ça. De plus, j’aimerais, si possible, avoir de la redondance.

  7. Greetings from Idaho! I’m bored to death at work so I decided to browse your website on my iphone during lunch break. I love the knowledge you provide here and can’t wait to take a look when I get home. I’m shocked at how quick your blog loaded on my cell phone .. I’m not even using WIFI, just 3G .. Anyways, good blog!

  8. bonjour je cherche un article ou une mémoire en francais sur l’ututilisation du hadoop dans le Big data merci 😉