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 :
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 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.
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
|
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
|
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
|
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:~$
|
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
|
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
|
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é.
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.
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 ».