Mise en œuvre d’Hadoop via un tarball sur Ubuntu avec Windows Azure – 1ère partie


Ce billet constitue notre seconde incursion Big Data dans l’univers Linux avec les services d’infrastructure de Windows Azure. Nous avons en effet précédemment abordé la mise en œuvre de la distribution Hortonworks Data Platform (HDP) avec CentOS sous Windows Azure ici. L’installation de la partie Hadoop était réalisée dans ce cadre au travers d’Ambari.

Au-delà d’un packaging donné, certains besoins impliquent parfois de disposer d’un cluster personnalisé. Aujourd’hui, nous allons voir comment nous pouvons créer une telle infrastructure avec des machines virtuelles Linux dans Windows Azure. Nous avons choisi d’axer ce tutoriel sur la distribution Ubuntu, dans sa dernière version (13.04) sortie le 28 avril dernier.

Pourquoi Ubuntu ? Tout simplement parce que cette distribution, qui possède une très large communauté et une bonne documentation, est simple et rapide à mettre en place. Cela n’en réduira que mieux la longueur du tutoriel 🙂

Ce tutoriel se décompose en deux parties :

  1. La première porte sur l’installation d’un cluster « single-node », c’est-à-dire qu’Hadoop fonctionne seulement sur une machine en local.
  2. La seconde partie porte 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.

L’objectif de ce tutoriel étant simplement d’aborder l’installation et le fonctionnement d’Hadoop dans ce contexte.

Dans la pratique, ce tutoriel a été testé avec les versions logicielles suivantes :

Dans cette première partie, nous vous invitons à créer une machine virtuelle (VM) Windows Azure, puis à y installer et à pré-configurer Hadoop sur un seul noeud. Nous nous appuyons pour cela largement sur le billet Running hadoop on Ubuntu Linux (Single-Node Cluster) publié par Michael G. Noll sur son site.

Par la suite, cette VM nous servira d’image « duplicata » de façon ne pas avoir à redérouler la pré-installation sur chacun des nœuds du cluster. Cela vous fera gagner beaucoup de temps. Libre à vous ensuite d’automatiser encore plus l’installation de nouvelles VM Hadoop en utilisant des scripts Windows PowerShell.

Etape 1 : Création de la machine virtuelle Windows Azure

Rendez-vous sur le portail de gestion Windows Azure ici. Sélectionnez la rubrique ORDINATEURS VIRTUELS et cliquez sur NOUVEAU:

image

Sélectionnez A PARTIR DE LA GALERIE. Pour les besoins de ce billet, et comme indiqué en introduction, nous nous appuyons sur la distribution Ubuntu Server 13.04 comme image pour monter notre machine virtuelle (VM) de base :

image

Passez à l’étape suivante de l’assistant en cliquant sur la flèche en bas à gauche et spécifiez alors les informations relatives à l’ordinateur virtuel. Pour notre illustration, le nom de machine est « master » et le nom d’utilisateur est « bigdatafrance ». Ajoutez un mot de passe pour vous connecter et décochez la case TELECHARGER UNE CLE SSH POUR L’AUTHENTIFICATION.

image

Passez à l’étape suivante. Précisez un nom unique dans NOM DNS.

image

Passez à l’étape suivante.

image

Validez la création de la VM. Une fois la VM créée, cliquez sur la flèche à gauche du nom de votre machine, ici master :

image

Vous devriez arrivez sur le tableau de bord de l’ordinateur virtuel.

image

On y aperçoit le statut, le DNS associé qui représente le service de cloud dans lequel se trouve l’ordinateur virtuel, le nom de l’hôte (hostname), une adresse IP (virtuelle) publique si nous voulons accéder à la machine depuis l’extérieur et enfin les détails SSH avec le numéro de port d’écoute. Ce dernier nous intéresse tout particulièrement pour la suite…

Etape 2 : Utilisation de PuTTY pour accéder à la VM

PuTTY est un client SSH et Telnet sur Windows. Il nous offre la possibilité d’administrer une machine Linux à distance via le protocole SSH. Tout se fait par un terminal ; les habitués de Linux ne seront pas perdu 😉

Nous l’utilisons dans ce tutoriel pour accéder aux machines Linux hébergées sur Windows Azure. Le point de terminaison Windows Azure vers le port SSH étant automatiquement créé après l’ajout d’une nouvelle machine Linux – à l’instar du protocole RDP avec Windows – lancez PuTTY avec les informations de connexions SSH.

Voici la procédure. Sur le tableau de bord de la VM Windows Azure, dans la rubrique de droite aperçu rapide, notez l’adresse le nom DNS complet de la machine (haddoopsurubuntu.cloudapp.net) et le numéro de port SSH (53512) dans DETAILS SSH :

image

Une fois PuTTY téléchargé, lancez l’utilitaire :

image

Entrez les informations suivantes :

  • HostName : le nom de l’hôte constitue la première partie des détails SSH
  • Port : le port est le numéro qui suit les « : » des détails SSH

Le bouton Save vous permettra de sauvegarder les paramètres précédents sous un nom de session de votre choix (ici « master »). Cliquez sur Open pour ouvrir un terminal avec une demande de connexion SSH avec votre VM Windows Azure.

image

Etape 3 : Préparatifs de l’installation d’Hadoop

Toutes nos opérations suivantes s’exécuteront dans la fenêtre notre terminal PuTTY.

Installation de Java

Hadoop requiert une version de la JVM égale ou supérieure à 1.5 (ou Java 5). Cependant, utiliser une version 1.6 et supérieure est recommandée. Nous allons utiliser dans ce billet une installation de Java 1.7, dernière version stable de la machine virtuelle développée par Oracle.

Vous pourrez, si vous le souhaitez, installer comme bon vous semble Java. Hadoop fonctionne avec les versions Open JDK et Oracle JDK parfaitement.

#installation Java

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java7-installer

Ces instructions proviennent du site communautaire Ubuntu.org

Une fois l’installation terminée, vous pouvez vérifier que Java est correctement installé en tapant la commande suivant :

java -version

Et voici ce qui peut être affiché :

java version "1.7.0_21"

Java(TM) SE Runtime Environment (build 1.7.0_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)


Ajout d’un utilisateur spécial Hadoop

Nous allons utiliser un utilisateur Hadoop dédié à l’exécution du runtime. S’il n’est pas nécessairement requis, il est néanmoins recommandé de procéder comme ceci dans la mesure où cette approche contribue à séparer l’installation d’Hadoop des autres logiciels présents sur la machine.

Tapez les lignes suivantes dans le terminal :

sudo addgroup hadoop

sudo adduser –ingroup hadoop hduser

Ces lignes ont pour fonction d’ajouter un utilisateur nommé hduser et un groupe d’utilisateur hadoop sur votre machine locale.

Hadoop fonctionne avec le protocole SSH pour gérer toutes les machines du cluster – celles qui sont sur votre réseau, plus votre machine locale. Nous avons donc besoin d’ajouter un accès SSH à localhost pour l’utilisateur hduser que nous venons de créer (seulement sur l’installation « single-node » à ce stade du tutoriel).

Nous partons du principe que vous avez SSH d’installé, en fonctionnement sur votre machine et dûment configuré pour qu’il ait la possibilité d’allouer des clés d’authentifications publiques. Surprenant ?! Pas tant que cela. Si vous effectuez ce tutoriel sur des VM Windows Azure, vous n’avez donc rien de particulier à faire. Toute cette étape de configuration est déjà réalisée pour vous :).

Pour commencer, nous devons générer une clé SSH pour l’utilisateur hduser :

su hduser

ssh-keygen -t rsa -P ""

La seconde ligne décrit la création d’une clé de type RSA avec un mot de passe vide. De manière générale, l’utilisation d’un mot de passe vide est non recommandée, mais, dans notre cas de figure, ceci est fait pour que la clé soit débloquée sans votre interaction (vous ne voulez pas à entrer le mot de passe de hduser à chaque fois qu’Hadoop interagit avec les nœuds).

Après cela, activez l’accès SSH sur votre machine locale via la clé fraichement créée :

cat $HOME/.ssh/id_rsa.pub>> $HOME/.ssh/authorized_keys

La dernière étape consiste à tester ce que nous venons de configurer. Il suffit de se connecter en SSH avec l’utilisateur hduser à la machine locale (localhost donc).

ssh localhost

Si vous avez une configuration spécifique de SSH sur votre machine locale comme par exemple un port non standard, vous pouvez définir des options pour un hôte spécifique dans $HOME/.ssh/config (consultez man ssh_config pour plus d’informations).

Désactivation d’IPV6

Une autre chose importante à configurer sur votre machine avant d’installer Hadoop est la connexion IPv6. En effet, Hadoop ne fonctionne pas correctement avec IPv6. Il est donc préférable de le désactiver.

Pour cela, ouvrez dans l’éditeur de votre choix le fichier /etc/sysctl.conf :

sudo nano /etc/sysctl.conf

Ajoutez les lignes suivantes à la fin du fichier :

# désactiver ipv6

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1

Vous avez besoin de redémarrer la machine pour que le fichier soit pris en compte :

sudo shutdown –r 0

Une fois redémarrée, testez si IPv6 est bien désactivé :

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

Si 0 est retourné, cela signifie que IPv6 est actif, 1 signifie que IPv6 est désactivé (ce que nous voulons au demeurant).

Etape 4 : Installation d’Hadoop à proprement parler

Récupération du tarball

Pour commencer, téléchargez le dernier « tarball » d’Hadoop sur les serveurs de la fondation Apache. Un « tarball » est un fichier archive (non-compressé) créé par le programme tar (tape archiver), logiciel standard UNIX.

Ensuite, il existe des utilitaires de compression venant s’ajouter par-dessus (comme gzip, qui est utilisé par l’équipe de développement d’Hadoop). Vous trouverez donc sur les serveurs Apache des fichiers « tar.gz » contenant l’ensemble de l’environnement Hadoop.

Dans ce tutoriel, nous utilisons la branche 1.1.2 accessible ici. Cette branche est encore en bêta, rien ne vous empêche de prendre la version 2.0 (version alpha) ou bien la version définitive 1.0.4 (version stable).

Commençons par nous placer dans le répertoire /usr/local avec votre utilisateur administrateur :

cd /usr/local/

Lancez le programme wget avec comme paramètre l’url de la tarball Hadoop « hadoop-1.1.2 » récupérée sur les serveurs Apache :

#récupération de la tarball

sudo wget http://mirrors.ukfast.co.uk/sites/ftp.apache.org/hadoop/core/hadoop-1.1.2/hadoop-1.1.2.tar.gz

 

Décompression et droits d’accès

La décompression est simple. Nous utilisons le programme tar comme suit, puis nous donnons les droits d’administration du dossier d’installation d’Hadoop à notre utilisateur hduser :

#décompression de l’archive

sudo tar xzf hadoop-1.1.2.tar.gz

#déplacement du dossier décompressé dans un nouveau dossier nommé hadoop

sudo mv hadoop-1.1.2 hadoop

#droits d’aministrateur donnés à l’utilisateur hduser du groupe hadoop sur le #dossier hadoop

sudo chown -R hduser:hadoop Hadoop

 


Modification des variables d’environnements et des fichiers de configuration

Passons maintenant à la configuration de la machine. Nous avons quelques variables d’environnement à ajouter pour que notre environnement Hadoop puisse fonctionner. Par exemple le système doit connaitre l’emplacement de Java (car les scripts de lancement d’Hadoop font appel à cette variable $JAVA_HOME).

Ouvrez le fichier $HOME/.bashrc :

su hduser

nano $HOME/.bashrc

Ajoutez les lignes suivantes à la fin du fichier système $HOME/.bashrc de l’utilisateur hduser :

# Configuration de la variable d’environnement Hadoop

export HADOOP_HOME=/usr/local/hadoop

 

# Configuration de JAVA_HOME

export JAVA_HOME=/usr/lib/jvm/java-7-oracle

 

# Quelques raccourcis pour lancer des jobs Hadoop et parcourir HDFS

unalias fs &> /dev/null

alias fs="hadoop fs"

unalias hls &> /dev/null

alias hls="fs -ls"

 

# Ajout du dossier Hadoop bin/ (dossier des exécutables) au PATH

export PATH=$PATH:$HADOOP_HOME/bin

Vous devez répéter cette opération pour chaque utilisateur de Hadoop, si vous en avez d’autres.

Nous en avons fini avec la pré-configuration de notre machine.

Modification des fichiers de configuration d’Hadoop

Passons aux fichiers de configuration propre à Hadoop se trouvant dans le dossier /usr/local/hadoop/conf

Notre objectif, pour le moment, est une installation sur une seule machine en local. Vous pouvez trouver plus d’informations sur le Wiki Hadoop.

hadoop-en.sh

Comme son nom l’indique, ce fichier répertorie les variables d’environnement qu’Hadoop doit connaître pour fonctionner. La seule variable que nous avons à dé-commenter dans ce fichier (càd enlever le « # » de début) est JAVA_HOME. Ouvrez le fichier à l’aide de votre éditeur de texte :

nano /urs/local/hadoop/conf/hadoop-env.sh

Puis, changez les lignes suivantes :

# The java implementation to use.  Required.

# export JAVA_HOME=/usr/lib/j2sdk1.5-sun

En :

#The java implementation to use.  Required.

export JAVA_HOME=/usr/lib/jvm/java-7-oracle


conf/*-site.xml

Dans cette section, nous allons configurer le répertoire où Hadoop stockera ses fichiers de données, les ports réseau du système sur lequel Hadoop écoutera, etc. Notre marche à suivre utilisera comme système de fichier HDFS, le système par défaut.

Vous pouvez laisser les paramètres comme tel, exception faite du paramètre hadoop.tmp.dir qui spécifie le répertoire Linux sur lequel Hadoop va se baser. Il stockera les fichiers système propre à son fonctionnement ainsi que vos données à traiter. Nous utiliserons le répertoire /app/hadoop/tmp dans ce tutoriel.

Créez ce répertoire via les commandes suivantes :

sudo mkdir -p /app/hadoop/tmp

sudo chown hduser:hadoop /app/hadoop/tmp

Si vous oubliez de paramétrer les autorisations (« chown »), vous verrez apparaître une exception java.io.IOException lorsque vous essaierez de formater le namenode dans la section suivante.

Passons maintenant aux fichiers xml. Ajoutez les lignes suivantes, dans les fichiers correspondants, entre les balises <configuration>…</configuration> (normalement vides).

Dans le fichier conf/core-site.xml :

<property>

  <name>hadoop.tmp.dir</name>

  <value>/app/hadoop/tmp</value>

  <description>A base for other temporary directories.</description>

</property>

 

<property>

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

  <value>hdfs://localhost: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 ajouté dans ce fichier deux propriétés :

  1. hadoop.tmp.dir : prend comme valeur le chemin du dossier que nous venons de créer (/app/hadoop/tmp). Hadoop stocke tout ce dont il a besoin dedans.
  2. fs.default.name : ici nous décrivons quel est le système de fichier utilisé par Hadoop par défaut, pour nous ce sera HDFS, et il est accessible sur la machine portant le nom localhost (nous le remplacerons par le master pour un cluster multi-nœuds) et sur le port 54310.

Dans le fichier conf/mapred-site.xml :

<property>

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

  <value>localhost: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>

La propriété mapred.job.tracker indique sur quel nœud est exécuté le Job Tracker, en charge de la gestion d’un job Hadoop.

Dans le fichier conf/hdfs-site.xml :

<property>

  <name>dfs.replication</name>

  <value>1</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>

Nous indiquons dans ce fichier que la réplication des fichiers sur HDFS se fera sur un nœud seulement car notre installation est en local. Nous le modifierons plus tard dans la seconde partie lorsque nous voudrons passer à un cluster multi-nœuds.

Etape 5 : Exécution du cluster Hadoop

La première chose à effectuer pour commencer est de formater le système de fichier Hadoop qui se superpose au système de fichier d’Ubuntu. Maintenant qu’il sait combien de nœuds il possède (dfs.replication), nous devons lancer la commande suivante pour préparer HDFS :

/usr/local/hadoop/bin/hadoop namenode –format

Notez que vous aurez à le reformater plus tard lorsque nous passerons à la seconde partie (cluster multi-nœuds).

Pour lancer le cluster, appelez le script suivant :

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

La commande JPS permet de savoir quels processus Java sont actuellement en exécution sur notre machine :

image

Et pour stopper le cluster ? Il y a un script aussi pour cela :

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

Ceci conclut notre première partie.

Comments (0)