Vous êtes sur la page 1sur 16

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 (oracle.com)

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 jdk-8u202-linux-x64.tar.gz

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:


http://hadoop.apache.org/.

La version à installer est la dernière version stable sur


http://hadoop.apache.org/releases.html.
Dans notre cas la version était la 2.8.5.

Il faut extraire l’archive et la placer dans /etc/hadoop:


tar zxvf hadoop-2.8.5.tar.gz

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 hadoop-env.sh. 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 core-site.xml dans le répertoire: /usr/hadoop/hadoop-
2.8.5/etc/hadoop/ en ajoutant:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

Cette configuration permet d’indiquer que le nom du système de fichier


est fs.defaultFS et que les répertoires et fichiers dans HDFS sont préfixés
avec: hdfs://localhost:9000.
On édite ensuite le fichier hdfs-site.xml qui se trouve dans:
/usr/hadoop/hadoop- 2.8.5/etc/hadoop/ et on ajoute les éléments suivants:
<configuration>
<property>
<name>dfs.replication</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:
start-dfs.sh

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/start-dfs.sh.

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/hadoop-hduser-namenode-debianvm.out

localhost: starting datanode, logging to /usr/hadoop/hadoop-


2.8.5/logs/hadoop-hduser-datanode-debianvm.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /usr/hadoop/hadoop-


2.8.5/logs/hadoop-hduser-secondarynamenode-debianvm.out

On peut se connecter à l’interface web du NameNode à l’adresse:

http://localhost:50070/

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 start-dfs.sh. 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 start-dfs.sh et
quand on essaie d’accéder à l’interface d’Hadoop en se connectant à
l’adresse http://localhost:50070.
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 09:41:21,836 WARN org.apache.hadoop.ipc.Client: Failed to connect
to server: localhost/127.0.0.1:9000: retries get failed due to exceeded maximum
allowed retries number: 10
java.net.ConnectException: Connection refused

at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at
sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

at
org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:
206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)

at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:495) at
org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:681)

at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:777)
at org.apache.hadoop.ipc.Client$Connection.access$3500(Client.java:409)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1542) at

org.apache.hadoop.ipc.Client.call(Client.java:1373)

at org.apache.hadoop.ipc.Client.call(Client.java:1337)
at
org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.ja
va:227)
at
org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.ja
va:116)

at com.sun.proxy.$Proxy15.versionRequest(Unknown Source) at
org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolClientSideTranslatorPB.ve
rsionRequest(DatanodeProtocolClientSideTranslatorPB.java:274)
at
org.apache.hadoop.hdfs.server.datanode.BPServiceActor.retrieveNamespaceInfo
(BPServiceActor.java:215)
at
org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandsha
ke(BPServiceActor.java:261)
at
org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.ja
va:746)
at java.lang.Thread.run(Thread.java:748)

Toutes les tentatives futures pour se connecter à


l’adresse localhost/127.0.0.1:9000 ne fonctionnent pas:
017-09-16 09:43:22,011 WARN
org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to
server: localhost/127.0.0.1:9000
2017-09-16 09:43:28,013 INFO org.apache.hadoop.ipc.Client: Retrying connect
to server: localhost/127.0.0.1:9000. Already tried 0 time(s); retry policy is
RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

8
2017-09-16 09:43:29,013 INFO org.apache.hadoop.ipc.Client: Retrying connect
to server: localhost/127.0.0.1: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
127.0.0.1 et le nom réseau de la machine dirigée vers 127.0.1.1.
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/stop-yarn.sh

/usr/hadoop/hadoop-2.8.5/sbin/stop-dfs.sh

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:


127.0.0.1 localhost
127.0.1.1 <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:
127.0.0.1 localhost
127.0.0.1 <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 core-site.xml et ajouter quelques éléments de configuration:
nano /usr/hadoop/hadoop-2.8.5/etc/hadoop/core-site.xml

Après avoir ajouté les éléments, le fichier doit se présenter de cette


façon:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
<description>The name of the default file
system.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hduser/hadoop_data/hd-data/tmp</value>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>/home/hduser/hadoop_data/hd-data/snn</value>
</property>
<property>
<name>dfs.data.dir</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:

start-dfs.sh

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:
http://localhost:50070

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/mapred-site.xml (ou le créer s’il
n’existe pas en copiant mapred-site.xml.template) et ajouter:
<configuration>
<property>
<name>mapreduce.framework.name</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- site.xml
et ajouter:
<configuration>
<property>
<name>yarn.nodemanager.aux-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:
start-yarn.sh
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/start-yarn.sh.
L’interface web du ResourceManager est accessible à l’adresse:
http://localhost:8088/
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: http://www.gutenberg.org/files/2600/2600-0.txt
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 2600-0.txt /user/hduser/input
A ce moment on peut voir le fichier dans HDFS si on va dans l’interface
web de Hadoop à l’adresse http://localhost:50070 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-
examples-2.8.5.jar wordcount /user/hduser/input/2600-0.txt output
Cette ligne permet de lancer le job “wordcount” qui est implémenté dans

13
le fichier JAR hadoop-examples-2.8.5.jar avec en entrée le fichier 2600-0.txt 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 12:16:44 INFO client.RMProxy: Connecting to
ResourceManager at /0.0.0.0:8032
17/09/09 12:16:45 INFO input.FileInputFormat: Total input files to
process : 1
17/09/09 12:16:46 INFO mapreduce.JobSubmitter: number of splits:1
17/09/09 12:16:47 INFO mapreduce.JobSubmitter: Submitting tokens for
job: job_1504949218149_0001
17/09/09 12:16:48 INFO impl.YarnClientImpl: Submitted
application application_1504949218149_0001
17/09/09 12:16:48 INFO mapreduce.Job: The url to track the job:
http://debianvm:8088/proxy/application_1504949218149_0001/
17/09/09 12:16:48 INFO mapreduce.Job: Running job:
job_1504949218149_0001
17/09/09 12:17:09 INFO mapreduce.Job: Job
job_1504949218149_0001
running in uber mode : false
17/09/09 12:17:09 INFO mapreduce.Job: map 0% reduce 0%
17/09/09 12:17:39 INFO mapreduce.Job: map 100% reduce 0%
17/09/09 12:17:53 INFO mapreduce.Job: map 100% reduce 100% 17/09/09
12:17:57 INFO mapreduce.Job: Job
job_1504949218149_0001
completed successfully
17/09/09 12:17:57 INFO mapreduce.Job: 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:
stop-yarn.sh

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 stop-dfs.sh

Le résultat peut être du type:


Stopping namenodes on [localhost] localhost: stopping namenode localhost:

stopping datanode

Stopping secondary namenodes [0.0.0.0]

0.0.0.0: stopping secondarynamenode

16

Vous aimerez peut-être aussi