Déploiement d'un cluster HADOOP

on mercredi 18 mai 2011


Chapitre IV : Implémentation Et Mise en Å’uvre
Hadoop peut être déployé sur différentes échelles. Les exigences de chacune sont différentes. Pour cela, Hadoop offre un grand nombre de paramètres ajustables qui influent sur son fonctionnement. En outre, il existe un certain nombre d'autres technologies qui peuvent être déployées avec Hadoop pour des capacités supplémentaires.
Notre but étant de déployer ce Framework pour avoir une plateforme d’exécution distribuée. Ce chapitre décrit les diverses étapes d’installation et de configuration de notre cluster.

IV.2- Éléments de l’architecture :  
Un cluster Hadoop peut être constitué d’un ensemble de machines hétérogènes, aussi bien du point de vue matériel que du point de vue logiciel (système d’exploitation) mais un cluster de machines homogènes est plus aisé à administrer.
IV.2.1- Composants Hard :
Avant de passer aux détails de la configuration, un petit mot sur le choix du matériel pour notre cluster.
Alors que les demandes de traitement des différents services dictera une configuration machine différente pour une efficacité optimale, il ya des points communs associés à la plupart des tâches de bases d’Hadoop.
Hadoop est conçu pour tirer partie de tout le matériel disponible.
Notre cluster, étant une plateforme d’étude et de test, nous avons déployé le cluster sur 4 machines de caractéristique :
-           Pentium IV, 3 GHz.
-           1Go de RAM.
-           80 Go de disque.
-           une interface réseau.
-           Lecteur CD-ROM.
-           l'écran, le clavier et la souris ne sont utiles que pendant l'installation initiale
Ajouter a cela les connectiques, modem ADSL, et Switch.

IV.2.2- Composants Soft :
Plateforme :
Nous utilisons une plate-forme Unix de type linux pour nos différents nÅ“uds du cluster. Plusieurs distributions se sont proposées à nous, néanmoins notre choix s’est finalement tourné vers Ubuntu. Non seulement c’est la distribution Linux la plus déployée dans le monde, mais a une communauté dynamique et très active, ce qui nous procure un soutien si on se trouvait face à des problèmes.

Hadoop :
Hadoop est un framework programmé en JAVA destiné aux applications distribuées et à la gestion intensive des données. Il permet aux applications de travailler avec une multitude de nœuds et un volume très important de données.
Le 3eme chapitre est consacré à l’explication des principales fonctionnalités et de l’architecture d’Hadoop.

JRE (Java Runtime Environment) :
Hadoop étant programmé en langage java, pour son exécution l’environnement d’exécution Java est pré-requis.

SSH (Secure Shell) :
Secure Shell  (SSH) est à la fois un programme informatique et un protocole de communication sécurisé. Le protocole de connexion impose un échange de clés de chiffrement en début de connexion. Par la suite toutes les trames sont chiffrées.
Cela nous permet de gérer notre cluster en sécurité, ainsi, que les échanges de données et informations entre nœuds du cluster.




IV.3- Schéma De L’Infrastructure :  



Figure IV.
1 : Schéma Du Développement.

Au début, l’installation devait se faire sur des serveurs d’hébergement d’OVH.  Pour le coût assez important de la location des serveurs dédiés, nous avons loué un seul serveur sur lequel on allait installer plusieurs serveurs virtuels – après installation d’un Hyperviseur -  afin d’avoir le nombre de serveurs, et donc nÅ“uds, voulus et enfin, déployer notre framework. Malheureusement, la virtualisation des ressources par le client n’est pas permise au niveau de l’infrastructure d’OVH, ni au niveau d’infrastructures d’autres hébergeurs. Et donc – vu que ça ne change pas grandes choses dans la configuration du cluster mis á part l’adressage et certaines autorisations et permissions qu’il faudra ajouter au niveau des firewalls – nous avons déployé notre système sur des machines connectées physiquement et donc sur un réseau local, que la figure IV.1 illustre.



IV.4- Déploiement Et Configuration :   
Le but est d’implémenter un cluster multi-nÅ“uds de 4 machines.
Philosophie du déploiement :

La meilleure façon de le faire est, dans un premier lieu, installer, configurer et tester Hadoop sur chaque machine et donc nous aurons quatre clusters à nœud unique.
Puis, fusionner les quatre machines (4 clusters) en un seul et unique cluster sur lequel une machine sera désignée comme Maitre et les trois autres comme esclaves.
C’est beaucoup plus aisé de régler les problèmes que nous pourrions rencontrer, en raison de la réduction de la complexité, en faisant une configuration de clusters à nÅ“ud-unique.



Figure IV.2 : Passer De Quatre Clusters à un seul Cluster Multi-NÅ“uds.


VI.4.1- Implémentation et Deploiement Des Clusters  á nÅ“ud-Unique:
Pré-requis & configurations de base:
1.      Installation de l’environnement Java :

ð Ajouter  des liens de sources à notre dépôt de sources :

Boulekhmir@ubuntu:~$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"



ð  Mettre à jour la liste des sources :

Boulekhmir@ubuntu:~$ sudo apt-get update


 Ã° Installer sun-java6-jdk:
Boulekhmir@ubuntu:~$ sudo apt-get install sun-java6-jdk


ð Choisir par défaut l’environnement d’exécution java :
Boulekhmir@ubuntu:~$ sudo update-java-alternatives -s java-6-sun
 


ð Vérifier que java est bien installé :
Boulekhmir@ubuntu:~$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)
 



2.      L’Ajout d’un utilisateur Hadoop dédié :

Par mesure de sécurité et facilité de gestion, j’utiliserai un compte dédié pour l’exécution et gestion d’Hadoop.
Aussi, un groupe dédié en cas de délégation de taches ou besoin d’autres comptes pour la gestion du cluster, puis, mettre le compte Hadoop dans le groupe.


Boulekhmir@ubuntu:~$ sudo addgroup hadoop
Boulekhmir@ubuntu:~$ sudo adduser --ingroup hadoop hadoop
 




3.      Configuration du SSH : 
Hadoop requière des accès sécurisés SSH pour gérer ses nœuds.
Pour la configuration d’un cluster a nÅ“ud unique, j’aurai besoin, donc, de configurer un accès SSH pour « localhost ».

ð Installation des packages SSH :

boulekhmir@ubuntu:~$ sudo apt-get install openssh-client[sudo]

password for boulekhmir: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
.......
Boulekhmir@ubuntu:~$ sudo apt-get install openssh-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
.............
 



ð Génération d’une paire de clés RSA :

hadoop@ubuntu:~$ ssh-keygen -t rsa -P ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
67:08:82:ec:ab:9f:1d:f8:96:f5:31:29:c4:43:41:7f hadoop@ubuntu
The key's randomart image is:

+--[ RSA 2048]----+
|     .o.         |
| . .  ..         |
|  o .o. . E      |
| .   .+. o       |
|  .  . .S.o      |
|   o  o +o       |
|  o .o o o       |
| . +o.  .        |
|..o.o            |
+-----------------+
hadoop@ubuntu:~$




ð Activation de l’accès SSH avec la paire de clés créée :

hadoop@ubuntu:~$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys



ð Test de la configuration SSH :

hadoop@ubuntu:~$ ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is ae:08:f4:5b:86:f2:e6:51:05:18:f2:56:14:00:79:ca.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux
Ubuntu 10.04 LTS


Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
116 packages can be updated.
6 updates are security updates.
 
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
 
hadoop@ubuntu:~$



4.      Désactiver IPv6 : 
Pour certains problèmes qui peuvent surgir à cause de l’adressage IPv6 dans les serveurs Hadoop (qui utilise 0.0.0.0 pour divers configuration réseau), j’ai préféré, pour éviter les erreurs de communication, désactiver IPv6. Pour ce faire :
On rajoute  au fichier de configuration : /etc/sysctl.conf les lignes suivantes :

#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
 


Hadoop
1.     Préparation : 
Pour cela, il nous faudra le package d’Hadoop que nous téléchargions du site officiel.
Pour une meilleure gestion nous créerons un dossier dans lequel nous mettrons les fichiers d’Hadoop.
Pour notre cas nous avons créé le dossier : /usr/local/hadoop

hadoop@ubuntu:~$ cd /usr/local
hadoop@ubuntu:/usr/local$ sudo tar xzf hadoop-0.20.2.tar.gz
hadoop@ubuntu:/usr/local$ sudo mv hadoop-0.20.2 hadoop
hadoop@ubuntu:/usr/local$ sudo chown -R hadoop:hadoop hadoop



2.     Configuration & Lancement :

A.    Configuration HDFS :

La configuration HDFS est contenue dans des fichiers XML dans le répertoire conf/.
Le fichier conf/hadoop-defaults.xml contient des valeurs système pour chaque paramètre dans Hadoop. C’est valeurs seront modifiées selon la stratégie utilisée pour l’architecture du réseau. Pour ce faire, des fichiers système seront configurés au niveau des nÅ“uds du cluster pour construire les liaisons et l’hiérarchie.

ð conf/*-site.xml
Dans cette section nous allons configurer le répertoire dans lequel Hadoop va stocker ses fichiers de données.
Bien sure, notre configuration utilisera le système de fichier d’Hadoop.

1-      Création d’un répertoire de stockage pour le système HDFS :

hadoop@ubuntu:~$ sudo mkdir /usr/local/hadoop-datastore/
hadoop@ubuntu:~$ sudo mkdir /usr/local/hadoop-datastore/hadoop-boulekhmir
hadoop@ubuntu:~$ chmod 750 sudo mkdir /usr/local/hadoop-datastore/hadoop-boulekhmir


 

2-      Configuration du fichier : hadoop-site.xml

 
    fs.default.name
    hdfs://localhost:9000
 
 
    dfs.data.dir
    >/usr/local/hadoop-datastore/data
 
 
    dfs.name.dir
    >/usr/local/hadoop-datastore/name
 


fs.default.name : est l’URL « Hôte et port » qui décrit le NameNode pour les nÅ“uds du cluster. Chaque machine du cluster Hadoop a besoin de connaître l'adresse de la NameNode. Les DataNode seront inscrit dans la NameNode en rendant leurs données accessibles à travers elle. Les Programmes clients se pourront se connecter à cette adresse pour récupérer l'emplacement des blocs de fichiers réels.

dfs.data.dir : C'est le chemin sur le système de fichiers local dans lequel la DataNode doit stocker ses données. Il n'est pas nécessaire que toutes les DataNode stockeent leurs données dans un meme chemin local, il est possible que ces machines soient hétérogènes. Toutefois, il vaut mieux simplifier la configuration et normaliser dans tout le système.

dfs.name.dir : C'est le chemin sur le système de fichiers local de la NameNode où les métadonnées sont stockées. Il est seulement utilisé par la NameNode pour trouver ses informations, et n'existe pas sur le DataNodes.


3-      Configuration du fichier : core-site.xml

  
     hadoop.tmp.dir
    
     /usr/local/hadoop-datastore/hadoop-boulekhmir/tmp
    
    
    
Base pour les autres dossiers tomporaires.
    
  


hadoop.tmp.dir : C'est le chemin sur le système de fichiers local dans lequel la DataNode doit stocker ses données temporaire.

4-      Configuration du fichier : hdfs-site.xml

  dfs.replication
  1
 
 
le nombre de replication des blocs (par défaut).
  



dfs.replication : C'est le facteur de réplication par défaut pour chaque bloc de données dans le système de fichiers HDFS.






5-      Configuration du fichier : mapred-site.xml

                                           
  mapred.job.tracker                    
  localhost:54311                     
                                        
    le host et le port que le Jobtraker de Map/Reduce utilise.                                             
 
                                     
                                          



ð Formatage HDFS :
La première étape à faire pour le déploiement d’Hadoop est le formatage de son système de fichier (HDFS) qui se trouve au dessus du système de fichiers local.
(Le formatage initialise simplement le répertoire spécifié par la variable dfs.name.dir)
Le formatage ne doit se faire qu’une foi au risque de perdre toutes les données sur le cluster.

hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/hadoop namenode -format




10/05/08 16:59:56 INFO namenode.NameNode: STARTUP_MSG:   
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = ubuntu/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.2
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010
************************************************************/
10/05/08 16:59:56 INFO namenode.FSNamesystem: fsOwner=hadoop,hadoop
10/05/08 16:59:56 INFO namenode.FSNamesystem: supergroup=supergroup
10/05/08 16:59:56 INFO namenode.FSNamesystem: isPermissionEnabled=true
10/05/08 16:59:56 INFO common.Storage: Image file of size 96 saved in 0 seconds.
10/05/08 16:59:57 INFO common.Storage: Storage directory .../hadoop-hadoop/dfs/name has been successfully formatted.
10/05/08 16:59:57 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1
************************************************************/
hadoop@ubuntu:~$



B.    Lancement du système de fichiers HDFS :
Cette commande va démarrer le serveur NameNode sur la machine maître (qui est où le script de démarrage dfs.sh a été invoquée). La commande lancera également le démarrage des DataNode sur chacune des machines esclaves.

hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/start-dfs.sh                                                     




3.     Lancement du Cluster (á nÅ“ud unique) : 

hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/start-all.sh



Ce qui va lancer les : Namenode, Datanode, Jobtracker et le Tasktracker sur la machine locale.

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ bin/start-all.sh 
 starting namenode, logging to /usr/local/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-namenode-ubuntu.out
 localhost: starting datanode, logging to /usr/local/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-datanode-ubuntu.out
 localhost: starting secondarynamenode, logging to /usr/local/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-secondarynamenode-ubuntu.out
 starting jobtracker, logging to /usr/local/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-jobtracker-ubuntu.out
 localhost: starting tasktracker, logging to /usr/local/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-tasktracker-ubuntu.out
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$



Pour vérifier si les processus d’Hadoop se sont lancés, on lance la commande  « jps »:

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ jps
2287 TaskTracker
2149 JobTracker
1938 DataNode
2085 SecondaryNameNode
2349 Jps
1788 NameNode




Avec la commande netstat, on peut vérifier si Hadoop est à l’écoute des ports de sa configuration.

hadoop@ubuntu:~$ sudo netstat -plten | grep java
tcp   0  0 0.0.0.0:50070   0.0.0.0:*  LISTEN  1001  9236  2471/java
tcp   0  0 0.0.0.0:50010   0.0.0.0:*  LISTEN  1001  9998  2628/java
tcp   0  0 0.0.0.0:48159   0.0.0.0:*  LISTEN  1001  8496  2628/java
tcp   0  0 0.0.0.0:53121   0.0.0.0:*  LISTEN  1001  9228  2857/java
tcp   0  0 127.0.0.1:54310 0.0.0.0:*  LISTEN  1001  8143  2471/java
tcp   0  0 127.0.0.1:54311 0.0.0.0:*  LISTEN  1001  9230  2857/java
tcp   0  0 0.0.0.0:59305   0.0.0.0:*  LISTEN  1001  8141  2471/java
tcp   0  0 0.0.0.0:50060   0.0.0.0:*  LISTEN  1001  9857  3005/java
tcp   0  0 0.0.0.0:49900   0.0.0.0:*  LISTEN  1001  9037  2785/java
tcp   0  0 0.0.0.0:50030   0.0.0.0:*  LISTEN  1001  9773  2857/java
hadoop@ubuntu:~$



4.     Arrêter le Cluster : 

Exécuter la commande:

hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/stop-all.sh

stopping jobtracker
localhost: stopping tasktracker
stopping namenode
localhost: stopping datanode
localhost: stopping secondarynamenode
hadoop@ubuntu:/usr/local/hadoop$



Ce qui va arrêtera les : Namenode, Datanode, Jobtracker et le Tasktracker sur la machine locale.

5.     Lancer un job Map/Reduce : 
1.      Téléchargement des données (Input) :
On va lancer un Job Map/Reduce pour tester notre cluster, pour cela, on lance le programme WordCount qui calcul le nombre d’occurrences des  mots dans un texte.



Pour le test j’ai choisie trois (03) livres :
-          The Outline of Science, Vol. 1 par  J. Arthur Thomson
-          The Notebooks of Leonardo Da Vinci
-          Ulysses par  James Joyce
Après téléchargement, on définit un répertoire où mettre ces fichiers texte (livres) :

hadoop@ubuntu:/tem$ sudo mkdir Gutenberg
hadoop@ubuntu:~$ cd /home/hadoop
hadoop@ubuntu:~$
ls -l /tmp/gutenberg/
total 3592
-rw-r--r-- 1 hadoop hadoop  674425 2007-01-22 12:56 20417-8.txt
-rw-r--r-- 1 hadoop hadoop 1423808 2006-08-03 16:36 7ldvc10.txt
-rw-r--r-- 1 hadoop hadoop 1561677 2004-11-26 09:48 ulyss12.txt
hadoop@ubuntu:~$


2.      Relancer le cluster d’Hadoop :

hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/start-all.sh


3.      Copier les données du support de stockage local au HDFS :

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ 
bin/hadoop dfs -copyFromLocal /tmp/gutenberg gutenberg
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ 
bin/hadoop dfs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2010-05-08 17:40 /user/hadoop/gutenberg
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ 
bin/hadoop dfs -ls gutenberg
Found 3 items
-rw-r--r--   1 hadoop supergroup     674762 2010-05-08 17:40 /user/hadoop/gutenberg/20417.txt
-rw-r--r--   1 hadoop supergroup    1573044 2010-05-08 17:40 /user/hadoop/gutenberg/4300.txt
-rw-r--r--   1 hadoop supergroup    1391706 2010-05-08 17:40 /user/hadoop/gutenberg/7ldvc10.txt
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$                                                  




4.      Lancer le Job de Map/reduce :
Cette commande va lancer la lecture de tous les fichiers HDFS dans le repertoire « gutenberg », exécuter le programme WordCount qui calculera le nombre


d’occurrences des mots, et finalement, sauvegarder le résultat dans le dossier HDFS « 
gutenberg-output »

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount gutenberg gutenberg-output
10/05/08 17:43:00 INFO input.FileInputFormat: Total input paths to process : 3
10/05/08 17:43:01 INFO mapred.JobClient: Running job: job_201005081732_0001
10/05/08 17:43:02 INFO mapred.JobClient:  map 0% reduce 0%
10/05/08 17:43:14 INFO mapred.JobClient:  map 66% reduce 0%
10/05/08 17:43:17 INFO mapred.JobClient:  map 100% reduce 0%
10/05/08 17:43:26 INFO mapred.JobClient:  map 100% reduce 100%
10/05/08 17:43:28 INFO mapred.JobClient: Job complete: job_201005081732_0001
10/05/08 17:43:28 INFO mapred.JobClient: Counters: 17
10/05/08 17:43:28 INFO mapred.JobClient:   Job Counters 
10/05/08 17:43:28 INFO mapred.JobClient:     Launched reduce tasks=1
10/05/08 17:43:28 INFO mapred.JobClient:     Launched map tasks=3
10/05/08 17:43:28 INFO mapred.JobClient:     Data-local map tasks=3
10/05/08 17:43:28 INFO mapred.JobClient:   FileSystemCounters
10/05/08 17:43:28 INFO mapred.JobClient:     FILE_BYTES_READ=2214026
10/05/08 17:43:28 INFO mapred.JobClient:     HDFS_BYTES_READ=3639512
10/05/08 17:43:28 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=3687918
a 17:43:28 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=880330
10/05/08 17:43:28 INFO mapred.JobClient:   Map-Reduce Framework                                                              



5.      Vérification de la sauvegarde du résultat :

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ bin/hadoop dfs -ls 
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2010-05-08 17:40 /user/hadoop/gutenberg
drwxr-xr-x   - hadoop supergroup          0 2010-05-08 17:43 /user/hadoop/gutenberg-output
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls gutenberg-output
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2010-05-08 17:43 /user/hadoop/gutenberg-output/_logs
-rw-r--r--   1 hadoop supergroup     880330 2010-05-08 17:43 /user/hadoop/gutenberg-output/part-r-00000
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$                                                         


 
6.      Récupérer le résultat du HDFS :
Bien sure, c’est possible de récupérer les données du cluster pour le sauvegarder sur le système de fichiers local :

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ bin/hadoop dfs -cat gutenberg-output/part-r-00000



hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ mkdir /tmp/gutenberg-output
 hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ bin/hadoop dfs -getmerge gutenberg-output /tmp/gutenberg-output
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ head /tmp/gutenberg-output/gutenberg-output 
"(Lo)cra"       1
"1490   1
"1498," 1
"35"    1
"40,"   1
"A      2
"AS-IS".        1
"A_     1
"Absoluti       1
"Alack! 1
hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$



6.     Les Interface Web d’Hadoop : 
Hadoop offre plusieurs interfaces web pour voir ce qui se passe dans le cluster :

Ø  http://localhost:50030/  - pour le JobTraker.
Ø  http://localhost:50060/  - Pour les tasktracker(s)
Ø  http://localhost:50070/  - Pour le(s) NameNode(s) d’HDFS.

1.      L’interface Web du JobTraker :

Cette interface fournie les informations et statistiques concernant les jobs dans le cluster qu’ils soient exécutés, complétés ou échoués et un historique.
Par défaut elle est accessible via : http://localhost:50030/




 


Figure IV.3 : L’interface Web Du JobTraker.

2.      L’interface Web des TaskTrakers :

Cette interface nous montre les taches exécutées et non-exécutées.
Par défaut elle est accessible via : http://localhost:50060/



Figure IV.4 : L’interface Web Du TaskTraker.

3.      L’interface Web du NameNode :

Présente un récapitulatif du cluster, y compris des informations sur la capacité totale et restante et les nœuds actif et morts.
Par défaut elle est accessible via : http://localhost:50070/
 

Figure IV.5 : L’interface Web Du NameNode.

IV.4.2- Implémentation et Deploiement Du Cluster  Multi-NÅ“uds:
A présent nous avons quatre clusters á nÅ“ud-unique qu’on va faire fusionner pour en avoir qu’un seul cluster multi-nÅ“uds, comportant un maître et trois (03) esclaves.
Pour commencer, il faudra éteindre chacun des clusters :

hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/stop-all.sh



Adressage Réseau :
Nous avons choisi comme plage d’adresse : 192.168.1.x
Afin que chaque machine reconnaisse les autres nÅ“uds du cluster sans utiliser l’adresse IP, nous mettons à jour le fichier hosts de toutes les machines (/etc/host) :

# /etc/hosts (Adresses/noms machines)
192.168.1.10    master
192.168.1.11    slave_1
192.168.1.12    slave_2
192.168.1.13    slave_3
 



Accès SSH :
Le compte utilisateur du maitre devra être capable de se connecter, via un accès SSH, à n’importe quel nÅ“ud dans cluster, y compris à sa propre machine (Donc tous les esclaves et la machine maitre).
Concernant les échanges d’informations entre machines, il est aussi nécessaire d’avoir une liaison sécurisée.
Pour ce faire, sur chacune des machines on exécute les commandes :

hadoop@ubuntu:~$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
hadoop@ubuntu:~$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys


La dernière étape est de tester l’accès ssh :

1-      Se connecter du compte utilisateur du maitre a la machine Maitre :

hadoop@master:~$ ssh master
The authenticity of host 'master (192.168.0.1)' can't be established.
RSA key fingerprint is 3b:21:b3:c0:21:5c:7c:54:2f:1e:2d:96:79:eb:7f:95.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'master' (RSA) to the list of known hosts.
Linux master 2.6.20-16-386 #2 Thu mai 7 20:16:13 UTC 2010 i686
...
hadoop@master:~$ 



2-      Se connecter du compte utilisateur du maitre a une machine Esclave :

hadoop@master:~$ ssh slave
The authenticity of host 'slave (192.168.0.2)' can't be established.
RSA key fingerprint is 74:d7:61:86:db:86:8f:31:90:9c:68:b0:13:88:52:72.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'slave' (RSA) to the list of known hosts.
Ubuntu 10.04
...
hadoop@slave:~$


Hadoop
J’expliquerai dans cette section comment passer d’une multitude de clusters (à nÅ“ud-unique) à un seul cluster (multi-nÅ“uds) avec un « Master » et plusieurs « Slaves »).
1.     Aperçu du cluster : 
 

Figure IV.6 : Exécution des Daemons.

Le maître exécute plusieurs daemons pour chaque couche : NameNode pour la couche de stockage HDFS et JobTraker pour la couche d’exécution Map/Reduce. Pour les machines esclaves, elle lance des daemons « slaves », ce qui se traduit par l’exécution d’un processus DataNode pour la couche de stockage HDFS et un processus TaskTraker pour la couche Map/Reduce.


Les daemons maitre sont responsables de la coordination et la gestion des daemons esclaves. Ces derniers s’occupent du stockage des données et l’exécution des jobs.

2.     Configuration : 

1.    Conf/masters (au niveau de la machine « Master ») :

Le fichier conf/masters définit les nœuds maitres de notre cluster multi-nœuds.
La configuration ne se fait que sur la machine « maitre ».
On met à jour le fichier conf/masters

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2/$ sudo gedit masters conf/masters


master



2.    Conf/slaves (au niveau de la machine « Master ») :

Ce fichier contient la liste des machines esclaves.
On met à jour la liste.

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2/$ sudo gedit masters conf/slaves


slave_1
slave_2
slave_3

Note :
Cette liste permet au master de lancer les DataNode du cluster de manière automatique en lançant la commande : bin/start-dfs.sh, et les stopper grâce a la commande : bin/stop-dfs.sh. Cependant, si on a à rajouter un nÅ“ud à notre cluster après avoir lancer ce dernier, c’est possible de le faire manuellement au niveau de la nouvelle machine esclave.






3.    Conf/*-site.xml (Toutes les machines du cluster y compris le master) :

ð Pour commencer, on a à changer, la valeur du « fs.default.name » qui définit le nÅ“ud qui lance le système de fichiers (HDFS) et donc les daemons des DataNode et dont l configuration se trouve dans le fichier core-site.xml.

>
  >fs.default.name>
  >hdfs://master:54310>
>




ð Au second lieu, on modifie le fichier mapred-site.xml, qui définit le JobTraker ainsi que le port.

>
  >mapred.job.tracker>
  >master:54311>
>                                                      



ð Finalement, mettre à jour le fichier hdfs-site.xml, qui définit les blocs de réplication par défaut. Et donc, sur combien de machine un fichier doit être dupliqué.

>
  >dfs.replication>
  >3>
>



Note :
D’autres options pourront être ajoutées a notre configuration, selon le besoin.




3.     Formatage du NameNode : 
Avant de lancer notre cluster multi-nœuds, nous avons à formater le support de stockage virtuel et donc un formatage HDFS.

hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ bin/hadoop namenode -format
... INFO dfs.Storage: Storage directory /usr/local/hadoop-datastore/hadoop-hadoop/dfs/name has been successfully formatted.
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$
 


4.     Lacement du cluster multi-nÅ“uds : 

Le lancement du cluster se fait en deux étapes :

La première, lancement des daemons HDFS :
Le processus NameNode dans le Master est lancé et les processus DataNodes sont exécutés sur chacune des machines esclaves.

La deuxième, lancement des daemons Map/Reduce :
Le JobTraker est lancé au niveau du Maitre, et les TaskTrakers se lancent au niveau du reste des machines du cluster (esclaves).

1.    HDFS daemons :

hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ bin/start-dfs.sh
starting namenode, logging to usr/local/hadoop/bin/../logs/hadoop-hadoop-namenode-master.out
slave_1: Ubuntu 10.04
slave_1: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-datanode-slave.out
slave_2: Ubuntu 10.04
slave_2: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-datanode-slave.out
slave_3: Ubuntu 10.04
slave_3: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-datanode-slave.out
master: starting secondarynamenode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-secondarynamenode-master.out
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ 



hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ jps
14799 NameNode
15314 Jps
14977 SecondaryNameNode
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ 



Au niveau des esclaves nous pouvons voir les daemons lancés :

hadoop@slave_1:/usr/local/hadoop/hadoop-0.20.2$ jps
15183 DataNode
15616 Jps
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$                    



2.    Map/Reduce daemons :

hadoop@master:/usr/local/hadoop/hadoop-0.2.20$ bin/start-mapred.sh
starting jobtraker, logging to usr/local/hadoop/bin/../logs/hadoop-hadoop-jobtraker-master.out
slave_1: Ubuntu 10.04
slave_1: starting tasktraker, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-tasktraker-slave.out
slave_2: Ubuntu 10.04
slave_2: starting tasktraker, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-tasktraker-slave.out
slave_3: Ubuntu 10.04
slave_3: starting tasktraker, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-tasktraker-slave.out



hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ jps
16017 Jps
14799 NameNode
15596 JobTracker
14977 SecondaryNameNode
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$                   



Au niveau des esclaves nous pouvons voir les daemons lancés :

hadoop@slave_1:/usr/local/hadoop/hadoop-0.20.2$ jps
15183 DataNode
15897 TaskTracker
16284 Jps
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$                   



5.     Stopper cluster multi-nÅ“uds : 
Comme au lancement, la mise en arrêt du cluster se fait en deux étapes, mais contrairement au lancement, on commence par arrêter les daemons MapReduce puis ceux du HDFS.

Mise en arrêt des daemons MapReduce :
Cela stoppera les TaskTrakers sur toute machine « esclave », ainsi que le JobTraker au niveau de la machine « maitre ».

hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ bin/stop-mapred.sh



Mise en arrêt des daemons HDFS :
Cela arrêtera les DataNodes sur toute machine « esclave », ainsi que le NameNode au niveau de la machine « maitre ».


hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ bin/stop-dfs.sh



On vérifie l’arrêt des daemons :
ð Au niveau du Master :

hadoop@master:/usr/local/hadoop/hadoop-0.2.20$ jps
18670 Jps
hadoop@master:/usr/local/hadoop/hadoop-0.2.20$ 



ð Au niveau du Master :

hadoop@slave:/usr/local/hadoop/hadoop-0.20.2$ jps
18894 Jps
hadoop@slave:/usr/local/hadoop/hadoop-0.20.2$



6.     Exécuter un Job MapReduce Sur le Cluster Multi-NÅ“uds : 
Pour ce faire, on suit le même enchainement d’étapes que dans le cluster de nÅ“ud-unique. Cependant, on utilisera un volume plus important en Input, de sorte d’avoir une plus large exécution de taches.
ð Donnée en Input :
    * The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson
    * The Notebooks of Leonardo Da Vinci
    * Ulysses by James Joyce
    * The Art of War by 6th cent. B.C. Sunzi
    * The Adventures of Sherlock Holmes by Sir Arthur Conan Doyle
    * The Devil's Dictionary by Ambrose Bierce
    * Encyclopaedia Britannica, 11th Edition, Volume 4, Part 3

ð Lancer le cluster multi-nÅ“uds :

hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ bin/start-dfs.sh



hadoop@master:/usr/local/hadoop/hadoop-0.2.20$ bin/start-mapred.sh



ð Copier les données Input sur le système HDFS.

hadoop@ubuntu:/usr/local/hadoop/hadoop-0.20.2$ 
bin/hadoop dfs -copyFromLocal /tmp/gutenberg gutenberg



ð Lancer le Job MapReduce au niveau du « Matser » :

hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ bin/hadoop jar hadoop-0.20.0-examples.jar wordcount  gutenberg gutenberg-output
... INFO mapred.FileInputFormat:Total input paths to process: 7
... INFO mapred.JobClient: Running job: job_0001
... INFO mapred.JobClient:  map 0% reduce 0%
... INFO mapred.JobClient:  map 28% reduce 0%
... INFO mapred.JobClient:  map 57% reduce 0%
... INFO mapred.JobClient:  map 71% reduce 0%
... INFO mapred.JobClient:  map 100% reduce 9%
... INFO mapred.JobClient:  map 100% reduce 68%
... INFO mapred.JobClient:  map 100% reduce 100%
.... INFO mapred.JobClient: Job complete: job_0001
... INFO mapred.JobClient: Counters: 11
... INFO mapred.JobClient:   org.apache.hadoop.examples.WordCount$Counter
... INFO mapred.JobClient:     WORDS=1173099
... INFO mapred.JobClient:     VALUES=1368295
... INFO mapred.JobClient:   Map-Reduce Framework
... INFO mapred.JobClient:     Map input records=136582
... INFO mapred.JobClient:     Map output records=1173099
... INFO mapred.JobClient:     Map input bytes=6925391
... INFO mapred.JobClient:     Map output bytes=11403568
... INFO mapred.JobClient:     Combine input records=1173099
... INFO mapred.JobClient:     Reduce input groups=131275
... INFO mapred.JobClient:     Reduce input records=195196



ð Récupérer le résultat du HDFS vers le système de fichiers du support local.
ð Découvrir le résultat :
Ø  Au niveau des « Slaves » pour les DataNodes:

# from /usr/local/hadoop/hadoop-0.20.2/logs/hadoop-hadoop-datanode-slave.log on slave
... INFO org.apache.hadoop.dfs.DataNode: Received block blk_5693969390309798974 from  /192.168.0.1
... INFO org.apache.hadoop.dfs.DataNode: Received block blk_7671491277162757352 from /192.168.0.1
<<>>
... INFO org.apache.hadoop.dfs.DataNode: Served block blk_-7112133651100166921 to /192.168.0.2
... INFO org.apache.hadoop.dfs.DataNode: Served block blk_-4114464184254609514 to /192.168.0.2
<<>>
... INFO org.apache.hadoop.dfs.DataNode: Received block blk_-2075170214887808716 from /192.168.0.2 and mirrored to /192.168.0.1:50010
... INFO org.apache.hadoop.dfs.DataNode: Received block blk_1422409522782401364 from /192.168.0.2 and mirrored to /192.168.0.1:50010
... INFO org.apache.hadoop.dfs.DataNode: Deleting block blk_-2942401177672711226 file /home/hadoop/hadoop-datastore/hadoop-hadoop/dfs/data/current/blk_-2942401177672711226


Ø  Au niveau des « Slaves » pour les TaskTrakers:

# from :/usr/local/hadoop/hadoop-0.2.20/logs/hadoop-hadoop-tasktracker-slave.log on slave
... INFO org.apache.hadoop.mapred.TaskTracker: LaunchTaskAction: task_0001_m_000000_0
... INFO org.apache.hadoop.mapred.TaskTracker: LaunchTaskAction: task_0001_m_000001_0
... task_0001_m_000001_0 0.08362164% hdfs://master:54310/user/hadoop/gutenberg/ulyss12.txt:0+1561677
... task_0001_m_000000_0 0.07951202% hdfs://master:54310/user/hadoop/gutenberg/19699.txt:0+1945731
<<>>
... task_0001_m_000001_0 0.35611463% hdfs://master:54310/user/hadoop/gutenberg/ulyss12.txt:0+1561677
... Task task_0001_m_000001_0 is done.
... task_0001_m_000000_0 1.0% hdfs://master:54310/user/hadoop/gutenberg/19699.txt:0+1945731
... LaunchTaskAction: task_0001_m_000006_0
... LaunchTaskAction: task_0001_r_000000_0
... task_0001_m_000000_0 1.0% hdfs://master:54310/user/hadoop/gutenberg/19699.txt:0+1945731
... Task task_0001_m_000000_0 is done.
... task_0001_m_000006_0 0.6844295% hdfs://master:54310/user/hadoop/gutenberg/132.txt:0+343695
... task_0001_r_000000_0 0.095238104% reduce > copy (2 of 7 at 1.68 MB/s) >
... task_0001_m_000006_0 1.0% hdfs://master:54310/user/hadoop/gutenberg/132.txt:0+343695
... Task task_0001_m_000006_0 is done.
... task_0001_r_000000_0 0.14285716% reduce > copy (3 of 7 at 1.02 MB/s) >
<<>>
... task_0001_r_000000_0 0.14285716% reduce > copy (3 of 7 at 1.02 MB/s) >
... task_0001_r_000000_0 0.23809525% reduce > copy (5 of 7 at 0.32 MB/s) >
... task_0001_r_000000_0 0.6859089% reduce > reduce
... task_0001_r_000000_0 0.7897389% reduce > reduce
... task_0001_r_000000_0 0.86783284% reduce > reduce
... Task task_0001_r_000000_0 is done.
... Received 'KillJobAction' for job: job_0001
... task_0001_r_000000_0 done; removing files.
... task_0001_m_000000_0 done; removing files.
... task_0001_m_000006_0 done; removing files.
... task_0001_m_000001_0 done; removing files.




IV.5- Écrire un programme dans l’aspect MapReduce :
Même si le framework Hadoop est écrit en Java, les programmes s’exécutant sur lui ne le sont pas forcement. On peut avoir divers programmes écris en divers langages (C++, Python…), permettant, ainsi, aux programmeurs d’écrire avec le langage de leur choix. Toutefois, une logique conceptuelle (Map/Reduce) est obligatoire pour une exécution répartie.
Nous allons écrire un programme dans un langage autre que java (Python), qui imitera WordCount. Le programme lira des fichiers texte et comptera le nombre d’apparition de chaque mot.
On aura donc des fichiers texte en entrée et en sortie (fichier de sortie : où est résumé le nombre d’occurrence de chaque mot dans le texte d’entrée).
L’avantage avec Hadoop c’est qu’il est doté d’utilitaires, tel que HadoopStreaming, qui nous facilitent le développement de nos programmes!
HadoopSteaming par exemple, nous aidera á transférer les données entre les deux fonctions á savoir : Map et Reduce via STDIN (Standard input) et STDOUT (Standard Output)
Nous allons donc juste utiliser sys.stdin de Python pour lire les données d’entrée et écrire nos résultats sur sys.stdout. Le reste sera gérer par Hadoop.
La logique conceptuelle, de tout programme devant être lancer sur un cluster Hadoop, étant basée sur les deux fonctions Map et Reduce, nous allons écrire les deux séparément :

ð Fonction Map : Mapper.py
Pour sa part, cette fonction lira les données à partir du STDIN (entrée standard), découpera le texte en mots et aura comme résultat une liste (intermédiaire) de mots avec leur nombre (intermédiaire) d’occurrence, elle affichera : 1, même si le est reproduit plusieurs fois et laissera la fonction Reduce faire la somme finale des occurrences.


01
import sys



02
# Entrées proviennent du STDIN (standard input)
04
for line in sys.stdin:

05
# supprimer les espaces avant et arrière
06
line = line.strip()

07
# diviser la ligne en mots
08
words = line.split()

09
# Incrémenter le compteur
10
for word in words:

11
     # écrire les résultats dans STDOUT (standard output);



12
print '%s\t%s' % (word, 1)

ð Fonction Reduce : Reducer.py
Cette fonction aura comme entrée le résultat de la fonction Map. Et donc un ensemble de lignes (dans un fichier texte) de mots ( 1)

01    import sys
02    # maps words to their counts
03    word2count = {}
04    # entrée du STDIN
05    for line in sys.stdin:
06    # supprimer les espaces avant et arrière
07        line = line.strip()
08    # Annalyser l’entrée venue de mapper.py
09        word, count = line.split('\t', 1)
10    # convertir le nombre (actuellement une chaine de
        caractères) en entier
11    try:
12         count = int(count)
13         word2count[word] = word2count.get(word, 0) + count
14    except ValueError:
15            # si count n est pas un nombre number ignorer
               cette ligne
16            pass
17    # trier les mots lexicographiquement
18    sorted_word2count = sorted(word2count.items(),
      key=itemgetter(0))
19    # écrire les résultats dans STDOUT (standard output)
20    for word, count in sorted_word2count:
21        print '%s\t%s'% (word, count)                            





Ø  Tester le programme :
Avant de lancer les programmes sur le cluster, mieux vaut les tester localement.

hadoop@ubuntu:  echo "billel billel averain abdessamed billel zaki averain" | /home/hadoop/mapper.py
billel     1
billel     1
averain    1
abdessamed    1
billel     1
zaki     1
averain    1


hadoop@ubuntu:  echo " billel billel averain abdessamed billel zaki averain " | /home/hadoop/mapper.py | sort | /home/hadoop/reducer.py
abdessamed     1
averain              2
billel                   3
zaki                     1


Il est possible d’utiliser d’autres sources en entrée tel qu’un livre.
hadoop@ubuntu:  cat “chemin d livre.txt” | /home/hadoop/mapper.py
Résultat ….


IV.6- Conclusion :
Au cours de ce chapitre, on a pu paramétrer et déployer le framework Hadoop sur un cluster multi-nÅ“uds, effectué des tests de calcul assez important et écrire un programme de test basé sur un autre langage que java. Nous avons pu concrétiser l’étude et la logique du fonctionnement du framework distribué « Hadoop ».

2 commentaires:

lucj a dit…

Merci pour ce post très clair, qui donne une bonne vision de l'environnement de Hadoop.

Anonyme a dit…

bravo!