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 :
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 :
|
ð Mettre à jour la liste des sources :
|
ð Installer sun-java6-jdk:
|
ð Choisir par défaut l’environnement d’exécution java :
|
ð Vérifier que java est bien installé :
Boulekhmir@ubuntu:~$ java -versionjava version "1.6.0_20"Java(TM) SE Runtime Environment (build 1.6.0_20-b02) |
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.
|
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 :
|
ð Génération d’une paire de clés RSA :
|
ð Activation de l’accès SSH avec la paire de clés créée :
|
ð Test de la configuration SSH :
|
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 ipv6net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.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
|
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 |
2- Configuration du fichier : hadoop-site.xml
|
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 : 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 : 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
|
ð 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.
|
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.
|
3. Lancement du Cluster (á nœud unique) :
|
Ce qui va lancer les : Namenode, Datanode, Jobtracker et le Tasktracker sur la machine locale.
|
Pour vérifier si les processus d’Hadoop se sont lancés, on lance la commande « jps »:
|
Avec la commande netstat, on peut vérifier si Hadoop est à l’écoute des ports de sa configuration.
|
4. Arrêter le Cluster :
Exécuter la commande:
hadoop@ubuntu:~$ /usr/local/hadoop/hadoop-0.20.2/bin/stop-all.sh |
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) :
|
2. Relancer le cluster d’Hadoop :
|
3. Copier les données du support de stockage local au HDFS :
|
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 »
d’occurrences des mots, et finalement, sauvegarder le résultat dans le dossier HDFS « gutenberg-output »
|
5. Vérification de la sauvegarde du résultat :
|
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 :
|
|
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 :
|
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 master192.168.1.11 slave_1 192.168.1.12 slave_2192.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 :
|
La dernière étape est de tester l’accès ssh :
1- Se connecter du compte utilisateur du maitre a la machine Maitre :
|
2- Se connecter du compte utilisateur du maitre a une machine Esclave :
|
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
|
master |
2. Conf/slaves (au niveau de la machine « Master ») :
Ce fichier contient la liste des machines esclaves.
On met à jour la liste.
|
|
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.
|
ð Au second lieu, on modifie le fichier mapred-site.xml, qui définit le JobTraker ainsi que le port.
|
ð 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.
|
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 :
|
|
Au niveau des esclaves nous pouvons voir les daemons lancés :
hadoop@slave_1:/usr/local/hadoop/hadoop-0.20.2$ jps15183 DataNode15616 Jps |
2. Map/Reduce daemons :
|
hadoop@master:/usr/local/hadoop/hadoop-0.20.2$ jps16017 Jps |
Au niveau des esclaves nous pouvons voir les daemons lancés :
hadoop@slave_1:/usr/local/hadoop/hadoop-0.20.2$ jps15183 DataNode |
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 ».
|
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 ».
|
On vérifie l’arrêt des daemons :
ð Au niveau du Master :
hadoop@master:/usr/local/hadoop/hadoop-0.2.20$ jps18670 Jpshadoop@master:/usr/local/hadoop/hadoop-0.2.20$ |
ð Au niveau du Master :
hadoop@slave:/usr/local/hadoop/hadoop-0.20.2$ jps18894 Jpshadoop@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 :
|
|
ð Copier les données Input sur le système HDFS.
|
ð Lancer le Job MapReduce au niveau du « Matser » :
|
ð 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:
|
Ø Au niveau des « Slaves » pour les TaskTrakers:
|
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)
|
Ø Tester le programme :
Avant de lancer les programmes sur le cluster, mieux vaut les tester localement.
|
|
Il est possible d’utiliser d’autres sources en entrée tel qu’un livre.
|
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:
Merci pour ce post très clair, qui donne une bonne vision de l'environnement de Hadoop.
bravo!
Enregistrer un commentaire