Mise en œuvre d’Hadoop via un tarball sur Ubuntu avec Windows Azure – 2nde partie


Ce billet constitue notre seconde incursion Big Data dans l’univers Linux avec les services d’infrastructure de Windows Azure. L’objectif ici consiste à créer un cluster Hadoop via un tarball d’Hadoop avec des machines virtuelles Linux dans Windows Azure. Ce tutoriel a été testé avec les versions logicielles suivantes :

Dans la première partie, nous nous sommes intéressés à l’installation d’un cluster « single-node », c’est-à-dire qu’Hadoop fonctionne dans ce cas seulement sur une machine en local.  Cette seconde partie porte à présent sur l’installation « multi-node » d’un cluster Hadoop, en utilisant deux machines préalablement installées avec le processus de la première partie. Cette dernière s’appuie pour cela largement sur le billet Running Hadoop on Ubuntu (Multi-Node Cluster) publié par Michael G. Noll sur son site.

L’approche de notre seconde partie est la suivante. Grâce à l’installation faite durant notre première partie sur une machine Ubuntu Linux Server 13.04, nous allons créer une image Windows Azure qui nous permettra de dupliquer notre installation et de ne pas reconfigurer tout ce dont il était nécessaire dans la première partie.

Etape 1 : Création d’une image Windows Azure à partir d’une VM

La création d’une image à partir d’un ordinateur virtuel existant est plutôt simple. Cependant, elle nous demande de supprimer la machine que nous avons auparavant créée pour ensuite en construire une image Windows Azure « sur ces cendres ».

Commencez donc par supprimer la machine anciennement créée dans la première partie. Comment ?! Supprimer tout le travail que nous avons effectué pour tout recommencer ?! Et bien non pas vraiment.

Dans la pratique et en réalité, nous supprimons juste l’allocation de notre machine virtuelle, mais l’installation est persistante :

image

Il est ensuite nécessaire de supprimer le service de cloud associé qui a été créé en même temps que la VM. Pour cela, cliquez sur la rubrique SERVICES DE CLOUD et sélectionnez le service correspondant qui porte le même nom que le nom DNS que vous avez précédemment spécifié.

image

Cliquez sur SUPPRIMER dans le bas de l’écran.

image

Une fois le service supprimé, sélectionnez la section ORDINATEURS VIRTUELS et cliquez sur DISQUES. Votre disque doit apparaître.

image

Sélectionnez-le puis cliquez sur SUPPRIMER dans la barre du bas.

image

Conservez le disque dur virtuel associé. Cette étape est primordiale pour récupérer ce disque dans l’onglet IMAGES. Sélectionnez à présent l’onglet IMAGES et cliquez sur le bouton CREER dans la barre du bas. La fenêtre suivante s’ouvre :

image

Précisez un nom pour l’image dans NOM. Nous choisissons « hadoopsurubuntu » comme nom. Précisez Linux dans FAMILLE DE SYSTEMES D’EXPLOITATION. Cliquez enfin sur l’icône dossier dans URL VHD.

image

Sélectionnez sous vhds le fichier correspondant au disque dur virtuel que nous venons de conserver.

image

Validez en cliquant sur Ouvrir.

image

Cochez J’ai exécuté l’agent Linux Windows Azure sur l’ordinateur virtuel associée à ce disque dur virtuel et validez l’opération de création de l’image. L’ajout d’une nouvelle image contenant notre installation d’Hadoop est terminée 🙂

Nous pouvons à présent créer des ordinateurs virtuels avec cette image.

Etape 2 : Création de deux nouvelles VMs à partir de l’image

Dans ce tutoriel, notre cluster de démonstration s’appuie sur 2 machines seulement mais cela s’avère dans les faits suffisant pour en illustrer les étapes clé.

Créez en premier lieu une nouvelle machine virtuelle. Naviguez pour cela comme précédemment vers la rubrique ORDINATEURS VIRTUELS, cliquez sur NOUVEAU puis sur A PARTIR DE LA GALERIE.

image

Dans l’assistant CREER UN ORDINATEUR VIRTUEL qui s’ouvre, sélectionnez MES IMAGES, puis l’image que nous venons de créer :

image

Les étapes suivantes sont équivalentes à celles que nous avons effectuées dans la première partie de ce tutoriel. Nous vous laissons le soin de créer avec l’image hadoopsurubuntu deux machines virtuelles, la première s’appelant « master » et la deuxième s’appelant « slave ».

image

image

image

N’oubliez pas de les mettre dans le même service de Cloud afin pour que ces dernières puissent communiquer via le même réseau virtuel.

Ainsi, lors de la création de la seconde VM, il convient de sélectionner SE CONNECTEZ A UN ORDINATEUR VIRTUEL EXISTANT à l’étape Mode de l’ordinateur virtuel. Vous devrez voir apparaître le nom de la machine master comme suit :

image

A ce stade, nos deux VMs sont en cours d’exécution :

image

Pour finir, il ne vous reste plus qu’à ajouter ces deux machines à PuTTY :

image

Si vous avez lancé les deux machines dans un terminal comme PuTTY (un terminal pour chaque), vous avez du vous rendre compte que nos deux machines portent le même nom de l’hôte dans le champ Host Name (or IP address) ; ce qui est pour le moins problématique pour communiquer…

image 

image

Nous allons donc remédier à cela par le biais de la commande Unix hostname, qui, utilisée sans paramètre, affiche le nom de la machine sur le réseau. Un mécanisme de Windows Azure détecte automatiquement le changement de nom d’une machine par le biais de la commande hostname et le DNS interne du service de cloud sera mis à jour de façon transparente 🙂

Sur la première machine, tapez la commande suivante :

#Changer le hostname

sudo hostname maitre

Sur la seconde, tapez ce qui suit :

sudo hostname esclave

Ces commandes ont pour effet de changer le nom de la première machine en « maitre » et le nom de la deuxième en « esclave ». Redémarrez les deux machines pour que les changements soient pris en compte.

Pour tester si les deux machines peuvent communiquer, un ping avec le nom d’hôte en paramètre est suffisant :

ping maitre

ping esclave

 

Etape 3 : Configuration d’Hadoop pour une exécution multi-nœuds

Modification de la configuration sur le « maitre » seulement

Accès SSH

L’utilisateur hduser sur la machine maitre, à savoir hduser@maitre, doit avoir accès à son propre compte utilisateur sur la machine maitre (en SSH, càd ssh maitre) et à l’utilisateur hduser sur la machine esclave, à savoir hduser@esclave.

Nous avons créée dans la première partie une clé RSA que nous allons compléter sur la machine esclave via la commande suivante :

hduser@maitre:~$ ssh-copy-id –i $HOME/.ssh/id_rsa.pub hduser@esclave

Cette commande vous demande votre mot de passe pour l’utilisateur hduser sur la machine esclave, et ensuite copie la clé SSH pour vous, créant le répertoire approprié et fixant les permissions nécessaires (magie magie).

La dernière étape est de tester la configuration SSH en se connectant avec le hduser du le maitre sur le compte hduser de l’esclave. Cette étape est aussi obligatoire pour « sauvegarder » hduser@maitre dans les hôtes connus de l’esclave (fichier known_hosts).

Donc, la connexion maître à maitre :

hduser@maitre:~$ ssh maitre

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 ‘maitre’ (RSA) to the list of known hosts.

Linux maitre 2.6.20-16-386 #2 Thu Jun 7 20:16:13 UTC 2007 i686

Puis la connexion entre maitre et esclave :

hduser@maitre:~$ ssh esclave

The authenticity of host ‘esclave (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 ‘esclave’ (RSA) to the list of known hosts.

Ubuntu 13.04

conf/masters

Le fichier /usr/local/hadoop/conf/masters est lu par les scripts de démarrage d’Hadoop (start-all.sh, etc.), c’est à l’intérieur que nous allons spécifier qui sera la machine sur laquelle le Namenode ainsi que le JobTracker vont s’exécuter.

Remplacez localhost par maitre. Puis sauvegardez le fichier :

maitre

conf/slaves

A l’inverse, ce fichier spécifie quelles machines seront les DataNodes. Editez le fichier, supprimez localhost et remplacez par :

maitre

esclave

Pour aller plus loin que notre petit tutoriel, si vous avez plus de deux datanodes, ajoutez une ligne par machine. Notez que le maitre est aussi un datanode pour optimiser notre cluster, qui est déjà très petit.

Modification de la configuration sur toutes les machines (maitre et esclave)

Editez les fichiers xml que nous avons modifiés dans la première partie pour prendre en compte les nouveaux paramètres du cluster. Vous devez impérativement le faire sur chacune des machines.

Vous avez en premier lieu à changer la propriété fs.default.name contenue dans le fichier conf/core-site.xml :

<property>

  <name>fs.default.name</name>

  <value>hdfs://maitre:54310</value>

  <description>The name of the default file system.  A URI whose

  scheme and authority determine the FileSystem implementation.  The

  uri’s scheme determines the config property (fs.SCHEME.impl) naming

  the FileSystem implementation class. The uri’s authority is used to

  determine the host, port, etc. for a filesystem.</description>

</property>

Nous avons remplacé localhost par maitre qui est le nom d’hôte de la machine principale de notre cluster.

En second lieu, vous avez également à modifier la propriété mapred.job.tracker dans le fichier conf/mapred-site.xml :

<property>

  <name>mapred.job.tracker</name>

  <value>maitre:54311</value>

  <description>The host and port that the MapReduce job tracker runs

  at.  If "local", then jobs are run in-process as a single map

  and reduce task.

  </description>

</property>

Enfin, en troisième et dernier lieu, la valeur de la propriété dfs.replication qui est à 1 dans le fichier conf/hdfs-site.xml doit désormais être positionnée à 2.

<property>

  <name>dfs.replication</name>

  <value>2</value>

  <description>Default block replication.

  The actual number of replications can be specified when the file is created.

  The default is used if replication is not specified in create time.

  </description>

</property>

 

Formatage HDFS

Une fois les fichiers de configurations correctement édités, vous allez reformater le système de fichier HDFS. Pour commencer, assurez-vous que le dossier /app/hadoop/tmp est vide et ne contient pas de fichier Hadoop (si vous avez formaté HDFS dans la première partie, des fichiers Hadoop existerons, ce qui causera une erreur Java difficilement identifiable).

Sur chacune des machines, supprimez le dossier /app/hadoop/tmp, puis recréez-le (vide) :

sudo rm –r /app/hadoop/tmp

sudo mkdir -p /app/hadoop/tmp

sudo chown hduser:hadoop /app/hadoop/tmp

Vous pouvez lancer le formatage de HDFS à présent avec la commande suivante :

/usr/local/hadoop/bin/hadoop namenode -format

Pour lancer votre cluster, tapez la commande suivante :

/usr/local/hadoop/bin/hadoop/bin/start-all.sh

Si vous exécutez JPS sur chacune de vos machines, vous devriez voir ceci sur le maître :

image

Et cela sur l’esclave :

image

Etape 4 : Test du cluster Hadoop

Nous allons faire un petit test dans cette dernière étape qui confirmera le bon fonctionnement de notre cluster nouvellement créé.

Pour ce faire, Hadoop prévoit une « batterie » d’exemples disponible dans la tarball que nous avons installée précédemment. Ces exemples sont contenus dans une archive Java (.jar) nommé « hadoop-examples-1.1.2.jar ».

Avant de lancer notre job, nous avons besoin de récupérer de la donnée à exploiter avec le WordCount. Rendez-vous sur le site du projet libre Gutenberg pour faire notre marché.

Téléchargez sur la machine maitre l’ebook suivant : The Colonies 1492 – 1750 by Reuben Gold Thwaites :

cd /usr/local/hadoop

sudo wget http://www.gutenberg.org/cache/epub/42701/pg42701.txt -U Firefox

Le dernier paramètre, -U, est présent dans la requête pour faire croire au site gutenberg.org que nous utilisons un navigateur pour accéder aux ressources (et que nous ne sommes pas des robots). C’est une astuce nécessaire pour télécharger via wget sur certains sites qui bloquent l’utilisation de ce procédé.

Ajoutez dans HDFS le fichier précédemment téléchargé (votre cluster doit être démarré au préalable) :

su hduser

cd /usr/local/hadoop

bin/start-all.sh

bin/hadoop dfs -copyFromLocal pg42701.txt /user/wordcount/input/gutenberg.txt

Dans cette dernière commande, nous appelons hadoop, et dans cet appel, le système de fichier par défaut, en l’occurrence dfs qui est HDFS dans notre cas. Nous faisons ensuite référence à la fonction –copyFromLocal qui se charge de prendre le fichier sur Ubuntu (1er paramètre qui suit) et de le copier dans le système de fichier du cluster (à l’adresse précisée en 2ème paramètre).

Pour vérifier que le fichier est bien présent sur notre cluster, tapez les commandes suivantes :

bin/hadoop dfs -ls /user/wordcount/input/

Found 1 items

-rw-r–r–   2 hduser supergroup     638641 2013-05-13 08:35 /user/wordcount/input/gutenberg.txt

Lancez le job wordcount, contenu dans hadoop-examples-1.1.2.jar :

bin/hadoop jar hadoop-examples-1.1.2.jar wordcount /user/wordcount/input /user/wordcount/output

La commande appelle la fonction jar qui permet de lancer un job contenu dans une archive Java, puis nous fournissons cette archive et précisons quelle classe à exécuter (wordcount). Les deux derniers paramètres correspondent respectivement au dossier où se trouvent les fichiers à analyser, et au dossier de sortie qui contiendra le résultat final de l’analyse (il sera créé par hadoop).

Voici ce qui doit vous être affiché :

13/05/13 09:18:31 INFO input.FileInputFormat: Total input paths to process : 1

13/05/13 09:18:31 INFO util.NativeCodeLoader: Loaded the native-hadoop library

13/05/13 09:18:31 WARN snappy.LoadSnappy: Snappy native library not loaded

13/05/13 09:18:32 INFO mapred.JobClient: Running job: job_201305130847_0003

13/05/13 09:18:33 INFO mapred.JobClient:  map 0% reduce 0%

13/05/13 09:20:46 INFO mapred.JobClient:  map 100% reduce 0%

13/05/13 09:21:56 INFO mapred.JobClient:  map 100% reduce 33%

13/05/13 09:22:00 INFO mapred.JobClient:  map 100% reduce 100%

Affichez le résultat final avec la commande cat :

bin/hadoop dfs -cat /user/wordcount/output/part-r-00000bin/hadoop dfs -cat /user/wordcount/output/part-r-00000

Cet exemple simple est présenté pour que vous puissiez tester votre cluster, néanmoins il est assez peu parlant. Nous vous laissons parcourir ce blog où vous trouverez des tutoriels et autres idées pour concevoir un programme Hadoop ainsi qu’une explication en détail du fonctionnement d’Hadoop ici.

Pour aller plus loin

Interfaces Web

Pour aller plus loin dans cette installation, vous pouvez regarder du côté des interfaces Web déployées avec votre cluster. Il est possible d’accéder à des services Hadoop dans votre browser :

  • Le JobTracker est accessible sur le port 50030 (http://localhost:50030). Il affiche le nombre de job exécuter et/ou en exécution et sur combien de nœuds.
  • Le TaskTracker est accessible sur le port 50060 (http://localhost:50060). Il affiche les tâches en exécution ou non ainsi que les journaux d’évènements.
  • Le NameNode est accessible sur le port 50070 (http://localhost:50070). Il affiche quant à lui des données relative à l’espace de stockage du système de fichier, il donne accès à une interface d’accès aux fichiers sur le cluster (un exploreur de fichier).

Remote Desktop ou LoadBalancer

Vous l’avez peut-être deviné, dans notre cas d’utilisation, aucune interface graphique n’est installée sur nos machines Ubuntu Server. Il est donc difficile de visualiser les interfaces Web dans un browser…

Pour y remédier, deux solutions s’offrent à vous. La première consiste à installer une interface graphique sur la machine maitre comme par exemple Gnome. Vous aurez ensuite à installer XRDP si vos machines sont hébergées sur Windows Azure pour pouvoir accéder au bureau à distance.

Notez au passage une chose importante : le package « ubuntu-desktop » depuis la version 12.10 d’Ubuntu correspond à l’installation de l’interface Unity (et non plus Gnome) qui n’est pas compatible XRDP. Ces deux lignes installeront dans l’ordre Gnome, XRDP et Firefox :

sudo apt-get install gnome-session-fallback

sudo apt-get install xrdp

sudo apt-get install firefox

Suivez ensuite le tutoriel Remote Desktop to Ubuntu In Windows Azure.

La seconde solution consiste à ouvrir les ports de votre cloud service (utilisation du LoadBalancer) afin d’avoir accès aux services Web d’Hadoop via un browser sur n’importe quel ordinateur – ce que nous ne saurions trop recommander du point de vue de la sécurité – Vous n’aurez alors plus qu’à taper dans un browser – les autres aussi… – l’adresse de votre service de cloud suivit du numéro de port correspondant au service choisi. Exemple : http://hadoopsurubuntu.cloudapp.net :50030/.

Ceci conclut ce second tutoriel sur la mise en œuvre d’Hadoop sur des machines Linux dans Windows Azure. Nous espérons que cela vous aura donné envie d’aller plus loin avec cette belle plateforme qu’est Windows Azure comme aime à le dire Mark Shuttleworth foundateur d’Ubuntu.

Comments (0)