Hadoop pour les DBAs (3/13) : Construire un cluster Hadoop

L’article précédent présente comment compiler et créer une distribution Hadoop sur Oracle Linux 7 à partir du code source d’Apache. Il s’agit maintenant d’installer et d’utiliser cette distribution. Cet article met donc logiquement en oeuvre un cluster de 3 serveurs. Son fonctionnement en ensuite validé en accédant aux différentes consoles et lançant un job MapReduce d’exemple.
La mise en oeuvre est « simple » et, de fait, une fois les serveurs installés, vous ne mettrez que quelques minutes pour configurer et démarrer le cluster. Elle n’implémente aucune des fonctionnalités de sécurité qu’on voudra généralement utiliser; ni authentification des utilisateurs, ni des serveurs esclaves…

Architecture

La configuration finale est représentée ci-dessous, elle met en oeuvre 3 serveurs nommés yellow, pink et green. Pour monter une architecture identique, vous pouvez, tout à fait, utiliser 3 machines Virtualbox avec 2Go de RAM chacunes et sur lesquelles vous installerez Oracle Linux 7.
Hadoop Cluster
Ici, il n’y a pas de contrôleur de domaine Kerberos, pas de clé de connexion ni de chiffrement des données ; SELinux sera simplement désactivés ; les ports seront ouverts sur le firewall ; les fonctionnalités de haute disponibilité et de sauvegardes ne sont pas utilisés. Enfin, aucune considération d’optimisation mémoire, de dimensionnement, de capacité du réseau ou même d’utilisation de l’espace n’est exploré. C’est le plus simple cluster Hadoop que vous verrez !

Pré-requis d’installation

Avant de procéder à l’installation, vous mettre en place une infrastructure système et réseau. Les pré-requis suivants doivent en particulier être vérifiés :

  • Les 3 systèmes doivent être installés avec Oracle Linux 7. En particulier Java, Ssh et, si possible, Rsync doivent être présents
  • Pour faciliter l’installation, désactivez SELinux et ouvrez tous les ports du firewall
  • Les configurations IP et la résolution des noms doit être en place sur les 3 serveurs
  • Un utilisateur applicatif, ici hadoop, sera créé sur tous les serveurs ; une équivalence ssh sera créée entre les 3 comptes de ces serveurs
  • Un système de fichiers doit être paramétré qui supportera HDFS, le système de fichiers distribué d’Hadoop

Les sections ci-dessous détaillent ces paramétrages.

Installation de 3 systèmes

Vous installerez 3 systèmes Oracle Linux 7 appellés green, pink et yellow. Installez les différents RPM y compris openssh, rsync et Java SE 8 comme décrit dans l’article précédent.

SELinux and Firewalld

Les commandes ci-dessous changent la zone du Firewall de votre serveur de public en trusted et ouvrent tous les ports pour cette zone :

systemctl enable firewalld
systemctl start firewalld
firewall-cmd --get-active-zones
firewall-cmd --permanent --zone trusted --add-port=1-65535/tcp
firewall-cmd --permanent --zone trusted --add-port=1-65535/udp
firewall-cmd --zone trusted --add-port=1-65535/tcp
firewall-cmd --zone trusted --add-port=1-65535/udp
firewall-cmd --set-default-zone trusted
firewall-cmd --get-active-zones
trusted
  interfaces: enp0s3
firewall-cmd --list-all
trusted (default, active)
  interfaces: enp0s3
  sources:
  services:
  ports: 1-65535/udp 1-65535/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Vous éditerez ensuite le fichier /etc/selinux/config de chacun des serveurs pour désactiver SELinux et les rebooterez :

sed -i 's/^[ \t]*SELINUX[ \t]*=.*$/SELINUX=disabled/' \
    /etc/selinux/config
reboot
getenforce

Configuration IP et DNS

Vous configurerez le réseau sur les 3 serveurs et vous déclarerez les adresses IP dans tous les fichiers /etc/hosts ou, si vous utilisez un DNS, vous vérifierez que les configurations sont effectives depuis chacun de ces serveurs.

Création d’un utilisateur Hadoop

En général, un utilisateur est créé par composant installé, i.e. HDFS et YARN. Pour simplifier la configuration, tous les composants sont installés dans un unique utilisateur nommé Hadoop. Lancez les commandes ci-dessous sur les 3 serveurs :

groupadd -g 501 hadoop
useradd -u 501 -g hadoop -m -p hadoop -s /bin/bash hadoop

Création d’une équivalence SSH entre les serveurs

Sur chacun des 3 serveurs, connectez vous avec l’utilisateur Hadoop créé précédemment et lancez la commande ci-dessous pour créer une clé SSH et enregistrer l’équivalence sur le serveur distant :

cd ~
mkdir .ssh
chmod 700 .ssh
ssh-keygen -t dsa -q -N "" -f .ssh/id_dsa
ssh-copy-id -o StrictHostKeyChecking=no yellow
ssh-copy-id -o StrictHostKeyChecking=no green
ssh-copy-id -o StrictHostKeyChecking=no pink

Une fois la configuration réalisée, vous pouvez vérifier que l’équivalence SSH est opérationnelle en lançant le script ci-dessous; il doit exécuter les 9 commandes qui en découlent sans demander de mot de passe :

for i in green pink yellow; do
   for j in green pink yellow; do
      ssh $i ssh $j "echo $i to $j: `date`"
   done
done
green to green: Wed Aug 6 20:51:25 CEST 2014
green to pink: Wed Aug 6 20:51:25 CEST 2014
green to yellow: Wed Aug 6 20:51:25 CEST 2014
pink to green: Wed Aug 6 20:51:25 CEST 2014
pink to pink: Wed Aug 6 20:51:26 CEST 2014
pink to yellow: Wed Aug 6 20:51:26 CEST 2014
yellow to green: Wed Aug 6 20:51:26 CEST 2014
yellow to pink: Wed Aug 6 20:51:26 CEST 2014
yellow to yellow: Wed Aug 6 20:51:26 CEST 2014

Installer et configurer Hadoop

Une fois les pré-requis du système mis en oeuvre, l’installation et la configuration d’un cluster Hadoop est très simple, il s’agit de :

  • Décompresser la distribution
  • Positionner quelques propriétés clés comme la liste des serveurs et les serveurs pour le Resource Manager et le Name Node.

Installer Hadoop

Hadoop est installé dans /usr/local/hadoop. Pour cela, il faut décompresser la distribution après l’avoir copiée dans /home/hadoop/hadoop-2.4.1.tar.gz :

# As root:
cd /usr/local
mkdir hadoop
chown hadoop:hadoop hadoop
su - hadoop
# As hadoop:
cd /usr/local
tar -zxvf /home/hadoop/hadoop-2.4.1.tar.gz \
   --transform 's/hadoop-2.4.1/hadoop/'

Créer le stockage local pour HDFS

Avant de créer le système de fichiers HDFS, il faut choisir la structure sur laquelle il reposera ; le système de fichiers distribué est, en effet, stocké sur des systèmes de fichiers locaux. Avec Oracle Linux 7, vous pouvez facilement utiliser XFS. Pour cette mise en oeuvre, ce type de considération n’est pas discuté et le système de fichiers HDFS est simplement créé dans /. Sur le serveur, Yellow qui contient le Name Node, lancez la commande ci-dessous :

# As root
mkdir /u01
chown hadoop:hadoop /u01
su - hadoop
# As hadoop
mkdir /u01/metadata
mkdir /u01/files

Sur Pink et Green, ne créez pas les structures de méta-données:

# As root
mkdir /u01
chown hadoop:hadoop /u01
su - hadoop
# As hadoop
mkdir /u01/metadata
mkdir /u01/files

Définir les propriétés du clusters

Il existe de nombreuses propriétés qu’il est possible de personaliser pour configurer un cluster Hadoop. Dans cette configuration, seules les propriétés minimales suivantes sont précisées :

  • Les emplacements des répertoires contenant les données stockées dans HDFS
  • L’emplacement, Adresse et Port, du Node Manager
  • Le nom du serveur du resource manager
  • la liste des serveurs esclaves qui font trouver les Data Nodes et les Node Managers.

Note:
On peut être amené à les séparer des « Name Node » et « Resource Manager » des serveurs esclaves. Pour avoir un cluster significatifs, cette configuration déploie tous les services esclaves sur tous les serveurs.

Les paramétrages associés sont stockés par défaut dans le sous répertoire etc/hadoop de l’installation. Il est inclus dans des fichiers XML qui sont décrits dans les sections suivantes.

HDFS directories

Les noms des répertoires dans lesquels sont stockées les données et les méta-données de HDFS sont configurés dans le fichier hdfs-site.xml. Ces paramétrages correspondent respectivement aux propriétés dfs.datanode.data.dir et dfs.namenode.name.dir. Voici un exemple de fichier ci-dessous:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/u01/files</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/u01/metadata</value>
  </property>
</configuration>

Adresse du Name Node

L’adresse et le port du Name Node sont spécifiés dans le fichier core-site.xml. Ce paramétrage correspond à la propriété fs.defaultFS. Voici un exemple de fichier ci-dessous:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
        <name>fs.defaultFS</name>
        <value>hdfs://yellow:9000</value>
    </property>
</configuration>

Serveur Resource Manager

Le nom du serveur Resource Manager est spécifié dans le fichier yarn-site.xml. Ce paramétrage correspond à la propriété yarn.resourcemanager.hostname. Voici un exemple de fichier ci-dessous:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>pink</value>
    </property>
</configuration>

Serveurs esclaves

La liste des serveurs esclaves du cluster Hadoop est stockée dans le fichier slaves. Ce fichier est nécessaire si vous voulez pouvoir utiliser les scripts standard pour démarrer l’ensemble des processus Data Node et Node Manager de manière centralisée. Voici un exemple de contenu de ce fichier :

yellow
pink
green

Copier les fichiers sur les 3 serveurs

Une fois la configuration terminée, et en supposant qu’elle ait été réalisée sur le serveur yellow, vous copierez les fichiers sur les autres serveurs:

for i in pink green; do
   scp /usr/local/hadoop/etc/hadoop/slaves \
          $i:/usr/local/hadoop/etc/hadoop/slaves
   scp /usr/local/hadoop/etc/hadoop/*-site.xml \
          $i:/usr/local/hadoop/etc/hadoop/.
done

Note:
Les scripts fournis avec hadoop peuvent réaliser l’opération de synchronisation grace à la variable HADOOP_MASTER. Le processus de démarrage est alors différent et on préfèrera, pour cette configuration au moins, utiliser la commande scp ou rsync

Formater HDFS

Pour terminer avec l’installation et la configuration du cluster, il ne reste qu’à formater le système de fichiers HDFS sur Yellow, le Name Node :

cd /usr/local/hadoop
bin/hdfs namenode -format color

Démarrer HDFS et YARN

Démarrez enfin le Name Node sur Yellow puis les Data Nodes sur les 3 serveurs esclaves. Pour cela, lancez les commandes suivantes sur Yellow sous l’utilisateur Hadoop :

cd /usr/local/hadoop
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemons.sh start datanode

Vous pourrez ensuite lancer YARN; le Resource Manager sur Pink, puis les Node Manager sur l’ensemble des serveurs. Pour cela, lancez les commandes suivantes sur Pink sous l’utilisateur Hadoop :

cd /usr/local/hadoop
sbin/yarn-daemon.sh start resourcemanager
sbin/mr-jobhistory-daemon.sh start historyserver
sbin/yarn-daemons.sh start nodemanager

Valider le fonctionnement de Hadoop

Pour valider le fonctionnement de la plateforme, vérifier que les processus sont correctement démarrés comme ci-dessous :

for i in yellow pink green; do
   echo "${i}:"
   ssh $i "ps -u hadoop -o user,pid,args |grep [j]ava|cut -c1-80"
done
yellow:
hadoop    3664 /usr/java/jdk1.8.0_11/bin/java -Dproc_namenode -Xmx1000m -Djava.n
hadoop    3786 /usr/java/jdk1.8.0_11/bin/java -Dproc_datanode -Xmx1000m -Djava.n
hadoop    3931 /usr/java/jdk1.8.0_11/bin/java -Dproc_nodemanager -Xmx1000m -Dhad
pink:
hadoop    5037 /usr/java/jdk1.8.0_11/bin/java -Dproc_datanode -Xmx1000m -Djava.n
hadoop    5143 /usr/java/jdk1.8.0_11/bin/java -Dproc_resourcemanager -Xmx1000m -
hadoop    5203 /usr/java/jdk1.8.0_11/bin/java -Dproc_historyserver -Xmx1000m -Dj
hadoop    5264 /usr/java/jdk1.8.0_11/bin/java -Dproc_nodemanager -Xmx1000m -Dhad
green:
hadoop    3260 /usr/java/jdk1.8.0_11/bin/java -Dproc_datanode -Xmx1000m -Djava.n
hadoop    3399 /usr/java/jdk1.8.0_11/bin/java -Dproc_nodemanager -Xmx1000m -Dhad

Vous pouvez vérifier les différents journaux générés dans le répertoire logs et vous connecter aux différentes consoles. Le port de la console du Name Node est 50070. Le menu « Data Nodes » doit montrer les Data Nodes :
Name Node ConsoleLes ports des consoles des différents Data Nodes sont 50075 :
Data Node Console Le port de la console du Resource Manager est 8088. Le menu « Nodes » doit afficher les 3 Node Managers comme dans la copie d’écran ci-dessous :
Yarn ConsoleLe port de la console du service de Job History est 19888 :
Job History ConsoleLes ports des consoles des Node Managers sont 8042 :
Node Manager Console

Lancer un job MapReduce

Pour valider que l’infrastructure fonctionne correctement, il est possible d’exécuter d’un job MapReduce. Pour cela, créez un répertoire /user/hadoop :

bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop

Vous pouvez ensuite copier le contenu de etc/hadoop de votre serveur local dans un répertoire input :

bin/hdfs dfs -put etc/hadoop input
bin/hdfs dfs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2014-08-06 19:44 input

Lancez enfin un des jobs MapReduce fournit comme exemple. Celui utilisé, « grep » compte le nombre d’instance correspondant aux formes d’une expression régulière et le stocke dans des fichiers dans un répertoire spécifié :

bin/hadoop jar \
    share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar \
    grep input output 'dfs[a-z.]+'

Afficher le résultat obtenu par le job :

bin/hdfs dfs -ls
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2014-08-06 19:44 input
drwxr-xr-x   - hadoop supergroup          0 2014-08-06 19:46 output
bin/hdfs dfs -ls output
Found 2 items
-rw-r--r--   3 hadoop supergroup          0 2014-08-06 19:46 output/_SUCCESS
-rw-r--r--   3 hadoop supergroup        227 2014-08-06 19:46 output/part-r-00000
bin/hdfs dfs -cat output/part-r-00000
6	dfs.audit.logger
4	dfs.class
3	dfs.server.namenode.
2	dfs.period
2	dfs.audit.log.maxfilesize
2	dfs.audit.log.maxbackupindex
1	dfsmetrics.log
1	dfsadmin
1	dfs.servers
1	dfs.namenode.name.dir
1	dfs.file
1	dfs.datanode.data.dir

Pour terminer, supprimer le répertoire et son contenu :

bin/hdfs dfs -rm -skipTrash -R /user

Arrêter HDFS et YARN

Pour arrêter YARN, arrêtez le Resource Manager sur Pink, puis les Node Managers sur l’ensemble des serveurs. Pour cela, lancez les commandes suivantes sur Pink sous l’utilisateur Hadoop :

cd /usr/local/hadoop
sbin/mr-jobhistory-daemon.sh stop historyserver
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemons.sh stop nodemanager

Pour arrêter HDFS, arrêter le Name Node sur Yellow puis les Data Nodes sur les 3 serveurs esclaves. Pour cela, lancez les commandes suivantes sur Yellow sous l’utilisateur Hadoop :

cd /usr/local/hadoop
sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemons.sh stop datanode

Le cluster Hadoop est installé et opérationnel, dans les prochains articles ses différents composants et leur utilisation seront tour à tour explorés… de HDFS à Park
Bibliographie :
Pour en savoir plus sur l’installation de Hadoop, lisez
[1] Hadoop MapReduce Next Generation – Cluster Setup