Ministère de l’Enseignement Supérieur et de la Recherche Scientifique
Direction Générale des Etudes Technologiques
***************
Institut Supérieur des Etudes Technologiques de Djerba
INSTALLATION HADOOP EN MODE
ATELIER PSEUDO-DISTRIBUE
I. Installation d’Hadoop sur Debian :
1. Introduction :
Cet atelier explique l’installation de Hadoop sur Debian GNU/linux.
La version d’Hadoop utilisée est celle téléchargeable directement du site
d’Apache. L’intérêt d’utiliser Debian est que beaucoup d’outils sont disponibles
sur cette distribution et qu’elle est gratuite.
Dans cet article, on détaille l’installation d’Hadoop et de YARN ainsi
que la configuration d’un cluster en single-node.
Une version de Debian installée sur une machine virtuelle est une
configuration très flexible pour essayer Hadoop sans polluer son système
d’exploitation hôte
2. Installation JDK :
Avant d’installer Hadoop, il faut installer Java si ce n’est pas déjà fait.
On peut télécharger la JDK sur le site d’Oracle:
Java Archive Downloads - Java SE 8 ([Link])
La version utilisée était la jdk1.8.0_202 pour linux en 64 bits.
On peut installer la JDK sur le disque en exécutant:
tar zxvf [Link]
1
Cette commande permet d’extraire les fichiers contenus dans
l’archive en listant tous les fichiers extraits.
En tant qu’utilisateur root, placer le répertoire résultant dans
/usr/java.
Pour passer en tant qu’utilisateur root, il faut taper:
su
Puis pour copier le répertoire:
mkdir /usr/j0ava
mv <nom du répertoire> /usr/java
3. Télécharger Hadoop sur le site d’Apache :
On peut télécharger Hadoop sur le site d’Apache:
[Link]
La version à installer est la dernière version stable sur
[Link]
Dans notre cas la version était la 2.8.5.
Il faut extraire l’archive et la placer dans /etc/hadoop:
tar zxvf [Link]
mkdir /etc/hadoop
mv <nom du répertoire> /usr/hadoop
4. Préparation de l’installation d’Hadoop :
4.1. Création d’un groupe et d’un utilisateur Hadoop :
Cette étape n’est pas indispensable mais permet de séparer les
permissions. Cet utilisateur sera spécifique à Hadoop. Pour créer
le groupe “hadoop” et l’utilisateur “hduser”, il faut exécuter en tant
qu’utilisateur root (taper su pour switcher vers l’utilisateur root):
addgroup hadoop
adduser --ingroup hadoop hduser
On peut ensuite se connecter avec cet utilisateur en écrivant:
su hduser
4.2. Installation SSH
Il faut installer SSH en tapant en tant qu’utilisateur root:
2
apt-get install openssh-server
systemctl enable ssh
systemctl start ssh
4.3. Configuration SSH
L’utilisation d’Hadoop se fait par l’intermédiaire d’une connexion SSH
même si Hadoop est exécuté localement. Il faut autoriser l’utilisateur
“hduser” à se connecter en SSH sur la machine en créant une clé et en
autorisant cette clé sur la machine.
La création de la clé se fait en exécutant les commandes suivantes. Il
faut être connecté en tant qu’utilisateur “hduser”:
ssh-keygen -t rsa -P ""
L’option -t indique qu’on souhaite créer une clé de type rsa. L’option -P sert à
indiquer une passphrase qui dans ce cas est vide.
La clé est rangée dans le répertoire /home/hduser/.ssh/id_rsa.pub.
Il faut ajouter cette clé aux clef autorisées pour les connexions SSH en
exécutant:
cat /home/hduser/.ssh/id_rsa.pub >> /home/hduser/.ssh/authorized_keys
Cette commande va rajouter le contenu de id_rsa.pub dans le fichier
authorized_keys en le créant s’il n’existe pas.
On peut ensuite tester l’accès en SSH en écrivant:
ssh localhost
Il faut ensuite accepter la connexion en écrivant “yes”. L’accès doit se
faire sans passphrase puisqu’on a indiqué une passphrase vide plus haut.
On peut sortir de la connexion SSH en écrivant:
exit
5. Configuration d’Hadoop en single-node cluster
Cette installation permet de configurer Hadoop pour que le cluster ne
soit formé que d’un seul nœud.
3
5.1. Configuration d’Hadoop
Dans un premier temps, il faut configurer le chemin de la JDK dans le
fichier de configuration d’Hadoop [Link]. Ce fichier se
trouve dans /usr/hadoop/hadoop-2.8.5/etc/hadoop/. On peut l’éditer en
tant qu’utilisateur root et en remplaçant:
export JAVA_HOME=${JAVA_HOME}
par:
export JAVA_HOME=/usr/java/jdk1.8.0_202/
On peut ensuite exécuter Hadoop en tapant:
/usr/hadoop/hadoop-2.8.5/bin/hadoop
L’exécution devrait afficher l’aide concernant Hadoop:
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
CLASSNAME run the class named CLASSNAME or
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
note: please use "yarn jar" to launch
YARN applications, not this command.
checknative [-a|-h] check native hadoop and compression
libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest>
create a hadoop archive
classpath prints the class path needed to get the
Hadoop jar and the required libraries
credential interact with credential providers daemonlog
get/set the log level for each daemon
trace view and modify Hadoop tracing
settings
Most commands print help when invoked w/o parameters.
4
5.2. Configuration du cluster en mode pseudo-distribué
Cette configuration correspond à la partie Pseudo-Distributed-Operation.
Elle permet de configurer le cluster en mode pseudo-distribué (puisqu’il
n’y a qu’une seule machine).
Il faut éditer le fichier [Link] dans le répertoire: /usr/hadoop/hadoop-
2.8.5/etc/hadoop/ en ajoutant:
<configuration>
<property>
<name>[Link]</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
Cette configuration permet d’indiquer que le nom du système de fichier
est [Link] et que les répertoires et fichiers dans HDFS sont préfixés
avec: hdfs://localhost:9000.
On édite ensuite le fichier [Link] qui se trouve dans:
/usr/hadoop/hadoop- 2.8.5/etc/hadoop/ et on ajoute les éléments suivants:
<configuration>
<property>
<name>[Link]</name>
<value>1</value>
</property>
</configuration>
Cette configuration permet d’indiquer le nombre de réplication d’un bloc
qui sera de 1 car il n’y a qu’un seul nœud dans le cluster.
5.3. Changement des droits sur le répertoire d’Hadoop
Pour permettre l’exécution d’Hadoop par l’utilisateur “hduser”, il faut
changer les droits sur le répertoire d’Hadoop en tapant:
chown -R hduser:hadoop /usr/hadoop/hadoop-2.8.5
5.4. Execution de jobs localement :
En se connectant en tant qu’utilisateur “hduser” (en tapant su hduser), on
peut formater le système de fichiers de HDFS en tapant:
/usr/hadoop/hadoop-2.8.5/bin/hdfs namenode -format
5
On peut créer le répertoire qui va contenir les logs lors de l’exécution en
écrivant:
mkdir /usr/hadoop/hadoop-2.8.5/logs
On peut paramétrer les variables d’environnement pour ajouter aux
chemins le répertoire d’Hadoop. Il faut éditer le fichier /home/hduser/.bashrc
en ajoutant:
export JAVA_HOME=/usr/java/jdk1.8.0_202/
export PATH=/usr/java/jdk1.8.0_202/bin/:$PATH
export HADOOP_HOME=/usr/hadoop/hadoop-2.8.5/
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
Pour prendre en compte les modifications des variables d’environnement,
on peut redémarrer sa session de terminal.
On peut démarrer ensuite le daemon du NameNode et du datanode en
exécutant:
[Link]
Sachant que le répertoire contenant ce fichier a été rajouté dans la
variable d’environnement PATH, on peut exécuter cette action de n’importe
où. Toutefois si ce n’est pas le cas, ce fichier se trouve dans
/usr/hadoop/hadoop- 2.8.5/sbin/[Link].
Les logs correspondant à cette action sont dans:
/usr/hadoop/hadoop-2.8.5/logs
L’exécution devrait indiquer:
Starting namenodes on [localhost]
localhost: starting namenode, logging to /usr/hadoop/hadoop-
2.8.5/logs/[Link]
localhost: starting datanode, logging to /usr/hadoop/hadoop-
2.8.5/logs/[Link]
Starting secondary namenodes [[Link]]
[Link]: starting secondarynamenode, logging to /usr/hadoop/hadoop-
2.8.5/logs/[Link]
On peut se connecter à l’interface web du NameNode à l’adresse:
[Link]
6
On devrait voir une interface du type :
Figure 1:Interface hadoop
5.5. Erreur “Connection refused”
Une erreur “Connection refused” peut se produire quand on essaie de
démarrer Hadoop avec [Link]. Cette erreur est assez déroutante
puisqu’elle peut se produire sans raison particulière alors que le cluster a
déjà fonctionné.
On peut s’apercevoir de cette erreur après exécution de [Link] et
quand on essaie d’accéder à l’interface d’Hadoop en se connectant à
l’adresse [Link]
Pour savoir s’il s’agit bien de la même erreur, il suffit d’aller dans le
répertoire des fichiers de logs:
vi /usr/hadoop/hadoop-2.8.5/logs/hadoop-hduser-datanode-<nom de la
machine>.log
Hadoop refuse de démarrer et logue une erreur du type:
7
2017-09-16 [Link],836 WARN [Link]: Failed to connect
to server: localhost/[Link]:9000: retries get failed due to exceeded maximum
allowed retries number: 10
[Link]: Connection refused
at [Link](Native Method) at
[Link]([Link])
at
[Link]([Link]:
206)
at [Link]([Link])
at [Link]([Link]) at
[Link]$[Link]([Link])
at [Link]$[Link]([Link])
at [Link]$[Link]$3500([Link])
at [Link]([Link]) at
[Link]([Link])
at [Link]([Link])
at
[Link]$[Link]([Link]
va:227)
at
[Link]$[Link]([Link]
va:116)
at [Link].$[Link](Unknown Source) at
[Link]
rsionRequest([Link])
at
[Link]
([Link])
at
[Link]
ke([Link])
at
[Link]([Link]
va:746)
at [Link]([Link])
Toutes les tentatives futures pour se connecter à
l’adresse localhost/[Link]:9000 ne fonctionnent pas:
017-09-16 [Link],011 WARN
[Link]: Problem connecting to
server: localhost/[Link]:9000
2017-09-16 [Link],013 INFO [Link]: Retrying connect
to server: localhost/[Link]:9000. Already tried 0 time(s); retry policy is
RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
8
2017-09-16 [Link],013 INFO [Link]: Retrying connect
to server: localhost/[Link]:9000. Already tried 1 time(s); retry policy is
RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
etc...
L’erreur semble provenir du fait qu’Hadoop est sensible aux
redirections DNS effectuées par Linux entre l’adresse localhost dirigée vers
[Link] et le nom réseau de la machine dirigée vers [Link].
Tout d’abord avant de commencer à changer la configuration, il faut
stopper l’exécution d’HDFS et de YARN si ce n’est pas déjà fait (en tant
qu’utilisateur “hduser”) en exécutant:
/usr/hadoop/hadoop-2.8.5/sbin/[Link]
/usr/hadoop/hadoop-2.8.5/sbin/[Link]
Ensuite, il faut connaître le nom réseau utilisé par Hadoop en
exécutant:
hostname --fqdn
Le résultat est le nom réseau utilisé.
Pour corriger le problème, il faut éditer le fichier /etc/hosts en tant
qu’utilisateur root:
su
nano /etc/hosts
Par défaut le fichier se présente de cette façon:
[Link] localhost
[Link] <nom réseau de la machine>
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Il faut paramétrer la même adresse pour le nom réseau de la machine
et commenter les lignes correspondant à IPv6:
[Link] localhost
[Link] <nom réseau de la machine>
# The following lines are desirable for IPv6 capable hosts
9
#::1 localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
Il faut ensuite affiner la configuration pour que certains fichiers
temporaires soient créés dans le répertoire de l’utilisateur “hduser”. Il faut
éditer le fichier [Link] et ajouter quelques éléments de configuration:
nano /usr/hadoop/hadoop-2.8.5/etc/hadoop/[Link]
Après avoir ajouté les éléments, le fichier doit se présenter de cette
façon:
<configuration>
<property>
<name>[Link]</name>
<value>hdfs://localhost:9000</value>
<description>The name of the default file
system.</description>
</property>
<property>
<name>[Link]</name>
<value>/home/hduser/hadoop_data/hd-data/tmp</value>
</property>
<property>
<name>[Link]</name>
<value>/home/hduser/hadoop_data/hd-data/snn</value>
</property>
<property>
<name>[Link]</name>
<value>/home/hduser/hadoop_data/hd-data/dn</value>
</property>
</configuration>
Les parties en gras sont les parties nouvelles par rapport à la
configuration précédente.
Il faut ensuite créer le répertoire hadoop_data dans le répertoire de
l’utilisateur “hduser” (cette étape doit être effectuée en tant qu’utilisateur
“hduser” pour qu’Hadoop puisse écrire dans le répertoire):
mkdir /home/hduser/hadoop_data
Il faut ensuite supprimer les fichiers temporaires d’Hadoop (en tant
qu’utilisateur root):
rm -r /tmp/hadoop*
Enfin, il faut reformater HDFS en exécutant (en tant qu’utilisateur
“hduser”):
10
hadoop namenode -format
On peut ensuite essayer de démarrer Hadoop avec:
[Link]
Le fichier log du NameNode devrait ne plus comporter l’erreur
“Connection refused”. On peut consulter ce fichier de log et les autres fichiers
pour le vérifier. Ces fichiers se trouvent dans:
/usr/hadoop/hadoop-2.8.5/logs/hadoop-hduser-datanode-<nom de la
machine>.log
/usr/hadoop/hadoop-2.8.5/logs/hadoop-hduser-namenode-<nom de la
machine>.log
/usr/hadoop/hadoop-2.8.5/logs/hadoop-hduser-secondarynamenode-<nom de la
machine>.log
On peut tenter de se connecter à l’interface web d’Hadoop sur:
[Link]
6. YARN
6.1. Configuration de YARN
Cette étape permet de configurer le gestionnaire de cluster YARN (Yet
Another Resource Negotiator) en nœud simple (ie. single-node). Il faut éditer le
fichier /usr/hadoop/hadoop-2.8.5/etc/hadoop/[Link] (ou le créer s’il
n’existe pas en copiant [Link]) et ajouter:
<configuration>
<property>
<name>[Link]</name>
<value>yarn</value>
</property>
</configuration>
Cette configuration permet d’indiquer d’utiliser YARN en tant
qu’implémentation de MapReduce.
Il faut ensuite éditer le fichier /usr/hadoop/hadoop-2.8.5/etc/hadoop/yarn- [Link]
et ajouter:
<configuration>
<property>
<name>[Link]-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
11
6.2. Exécution de YARN
Après la configuration, on peut démarrer le daemon ResourceManager
et NodeManager en tapant:
[Link]
Cette commande est dans un répertoire rajouté dans la variable
d’environnement PATH donc elle doit être accessible de n’importe où. Ce
fichier se trouve dans /usr/hadoop/hadoop-2.8.5/sbin/[Link].
L’interface web du ResourceManager est accessible à l’adresse:
[Link]
L’interface est du type:
Figure 2 : Interface YARN
6.3. Exécution d’un job MapReduce
Le job le plus couramment exécuté pour illustrer l’exécution de jobs
MapReduce est le Wordcount (i.e. comptage de mots). Il faut utiliser en entrée
un texte et en sortie du job, on obtient une liste de mots avec le nombre
d’occurrences pour chaque mot.
12
Comme texte d’entrée, on peut utiliser le fichier correspondant au
livre Guerre et Paix: [Link]
Il faut copier ce fichier dans HDFS en écrivant:
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/hduser
hdfs dfs -mkdir /user/hduser/input
hdfs dfs -put [Link] /user/hduser/input
A ce moment on peut voir le fichier dans HDFS si on va dans l’interface
web de Hadoop à l’adresse [Link] dans l’onglet Utilities ➔
Browse the file system:
Figure 3 : HDFS
On peut lancer le job en écrivant:
hadoop jar /usr/hadoop/hadoop-2.8.5/share/hadoop/mapreduce/hadoop- mapreduce-
[Link] wordcount /user/hduser/input/[Link] output
Cette ligne permet de lancer le job “wordcount” qui est implémenté dans
13
le fichier JAR [Link] avec en entrée le fichier [Link] qui
a été copié dans HDFS. Le résultat sera écrit dans le répertoire output dans
HDFS.
L’exécution donnera en sortie:
17/09/09 [Link] INFO [Link]: Connecting to
ResourceManager at /[Link]:8032
17/09/09 [Link] INFO [Link]: Total input files to
process : 1
17/09/09 [Link] INFO [Link]: number of splits:1
17/09/09 [Link] INFO [Link]: Submitting tokens for
job: job_1504949218149_0001
17/09/09 [Link] INFO [Link]: Submitted
application application_1504949218149_0001
17/09/09 [Link] INFO [Link]: The url to track the job:
[Link]
17/09/09 [Link] INFO [Link]: Running job:
job_1504949218149_0001
17/09/09 [Link] INFO [Link]: Job
job_1504949218149_0001
running in uber mode : false
17/09/09 [Link] INFO [Link]: map 0% reduce 0%
17/09/09 [Link] INFO [Link]: map 100% reduce 0%
17/09/09 [Link] INFO [Link]: map 100% reduce 100% 17/09/09
[Link] INFO [Link]: Job
job_1504949218149_0001
completed successfully
17/09/09 [Link] INFO [Link]: Counters: 49
File System Counters
FILE: Number of bytes read=649694
FILE: Number of bytes written=1571945
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=3359665 HDFS: Number of bytes
written=487290 HDFS: Number of read operations=6
HDFS: Number of large read operations=0 HDFS: Number of write
operations=2
Job Counters
Launched map tasks=1 Launched reduce tasks=1 Data-local map
tasks=1
Total time spent by all maps in occupied slots (ms)=27460
Total time spent by all reduces in occupied slots (ms)=10545
Total time spent by all map tasks (ms)=27460
Total time spent by all reduce tasks (ms)=10545
Total vcore-milliseconds taken by all map tasks=27460 Total
vcore-milliseconds taken by all reduce tasks=10545
Total megabyte-milliseconds taken by all map tasks=28119040
Total megabyte-milliseconds taken by all reduce
tasks=10798080
Map-Reduce Framework
Map input records=66055 Map output records=566308 Map output
14
bytes=5541955
Map output materialized bytes=649694 Input split bytes=115
Combine input records=566308
Combine output records=41991 Reduce input groups=41991 Reduce
shuffle bytes=649694 Reduce input records=41991 Reduce output
records=41991 Spilled Records=83982 Shuffled Maps =1
Failed Shuffles=0 Merged Map outputs=1
GC time elapsed (ms)=210 CPU time spent (ms)=6020
Physical memory (bytes) snapshot=412577792 Virtual memory
(bytes) snapshot=3924443136 Total committed heap usage
(bytes)=284688384
Shuffle Errors
BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=3359550 File Output Format Counters
Bytes Written=487290
On peut voir le fichier contenant les résultats en écrivant:
hdfs dfs -ls /user/hduser/output
Les fichiers sur HDFS sont:
Found 2 items
-rw-r--r-- 1 hduser supergroup 0 2017-09-09 12:17
/user/hduser/output/_SUCCESS
-rw-r--r-- 1 hduser supergroup 487290 2017-09-09 12:17
/user/hduser/output/part-r-00000
On peut récupérer le fichier contenant les résultats en écrivant:
hdfs dfs -get /user/hduser/output/part-r-00000
On peut lire maintenant le fichier. Le contenu est une liste de mots avec
le nombre d’occurrences pour chaque mot.
Pour supprimer les fichiers se trouvant sur HDFS, il faut exécuter:
hdfs dfs -rm -R /user/hduser/output hdfs dfs -rm -R /user/hduser/input
6.4. Stopper l’exécution de YARN et Hadoop
Il faut taper les commandes suivantes:
[Link]
Si l’arrêt se passe bien, l’exécution est du type:
stopping yarn daemons stopping resourcemanager
localhost: stopping nodemanager
15
localhost: nodemanager did not stop gracefully after 5 seconds:
killing with kill -9
no proxyserver to stop [Link]
Le résultat peut être du type:
Stopping namenodes on [localhost] localhost: stopping namenode localhost:
stopping datanode
Stopping secondary namenodes [[Link]]
[Link]: stopping secondarynamenode
16