Sommaire

Installation de Hadoop via Docker

Les étapes pour installer Hadoop via Docker sont largement adaptées de la page de Lilia Sfaxi, elles-mêmes reposant sur le projet github de Kai Liu.


Installation de Docker et des nœuds

Pour installer Docker, merci de suivre les consignes disponibles ici, en fonction de votre système d’exploitation (lisez les System requirements pour vérifier que votre machine est adaptée). Si votre machine est trop ancienne, ou avec peu d’espace disque ou de mémoire RAM, il y a de bonnes chances que l’installation ne fonctionne pas. Si c’est le cas,

  • soit vous pouvez travailler avec votre voisin,
  • soit vous pouvez aller directement à la seconde partie du TP, et réaliser les exercices en local (sans Hadoop).

A partir de maintenant et pour la suite des 3 TPs, il vous faudra penser à lancer au préalable Docker (qui s’exécutera en arrière plan).

Nous allons utiliser trois contenaires représentant respectivement un nœud maître (le Namenode) et deux nœuds esclaves (les Datanodes).

Télécharger l’image Docker

Depuis un Terminal, téléchargez l’image Docker que j’ai stockée sous dockerhub (volume à télécharger > 3.3 GB !). Si votre ordinateur est équipé de seulement 8GB de RAM, alors utilisez la commande suivante :

docker pull stephanederrode/docker-cluster-hadoop-spark-python-8:3.5

Sinon utilisez celle-ci:

docker pull stephanederrode/docker-cluster-hadoop-spark-python-16:3.5

Ce container contient une distribution Linux/Ubuntu, et les librairies nécessaires pour utiliser Hadoop et Spark. Il contient également Python3.x (version du langage Python compatible avec les versions de Hadoop et Spark installées).

Lancer les contenaires pour simuler un data center

Créez les 3 contenaires à partir de l’image téléchargée. Pour cela:

a. Créez un réseau qui permettra de relier les trois contenaires:

docker network create --driver=bridge hadoop

b. Créez et lancez les trois contenaires (les instructions -p permettent de faire un mapping entre les ports de la machine hôte et ceux du contenaire). Important Dans la suite, adaptez la syntaxe -16 à la syntaxe -8, en fonction de l’image que vous avez téléchargée.

docker run -itd --net=hadoop -p 9870:9870 -p 8088:8088 -p 7077:7077 \
  -p 16010:16010 -p 9999:9999 --name hadoop-master --hostname hadoop-master \
  stephanederrode/docker-cluster-hadoop-spark-python-16:3.5

docker run -itd -p 8040:8042 --net=hadoop --name hadoop-slave1 --hostname hadoop-slave1 \
  stephanederrode/docker-cluster-hadoop-spark-python-16:3.5

docker run -itd -p 8041:8042 --net=hadoop --name hadoop-slave2 --hostname hadoop-slave2 \
  stephanederrode/docker-cluster-hadoop-spark-python-16:3.5

Remarques

  • Dans la commande précédente, le caractère \ (en rouge), utilisé pour poursuivre une commande sur plusieurs lignes, peut parfois poser des problèmes. Pour résoudre ce problème, vous pouvez copier cette ligne dans un éditeur de texte, et supprimer ce caractère ainsi que les sauts de ligne.

  • Sur certaines machines, la première ligne de commande ne s’exécute pas correctement. L’erreur provient sans doute du port 9870 que doit déjà être utilisé par une autre application installée sur votre machine. Vous pouvez alors supprimer ce port de la première ligne de commande :

docker run -itd --net=hadoop -p 8088:8088 -p 7077:7077 -p 16010:16010 -p 9999:9999 \
  --name hadoop-master --hostname hadoop-master \
  stephanederrode/docker-cluster-hadoop-spark-python-16:3.5
  • Le port 9999 sera utilisé dans le 3ième TP (librairie Spark streaming).

Préparation au TP

  • Entrez dans le contenaire hadoop-master :
docker exec -it hadoop-master bash

Le résultat est le suivant:

root@hadoop-master:~#

Il s’agit du shell ou du bash (Linux/Ubuntu) du nœud maître.

  • La commande ls, qui liste les fichiers et dossiers du dossier en cours, doit faire état des fichiers suivants :
hdfs start-hadoop.sh ventes

Le dossier ventes contient un fichier de données qui sera utilisé lors de la seconde partie du TP.

  • Pour des besoins ultérieurs, on prendra soin de stocker la variable d’environnement JAVA_HOME. Pour un processeur amd, tapez
export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

Pour un processeur arm (plus rare, utilisé sur les Apple récents), tapez

export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-arm64"

Dans ce dernier cas (et uniquement dans ce dernier cas), vous devez aussi éditer le fichier /usr/local/hadoop/etc/hadoop/hadoop-env.sh avec l’éditeur nano:

nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

et remplacer la ligne

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

par la ligne

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64

Quitter nano en exécutant dans CTRL+O + valider pour sauvegarder et CTRL+X pour quitter (c’est indiqué dans le menu).

  • On peut maintenant formater l’espace disque au format hdfs:
/usr/local/hadoop/bin/hdfs namenode -format

Lancement du daemon Hadoop

La première chose à faire sur le Terminal connecté au hadoop-master est de lancer les daemons Hadoop :

./start-hadoop.sh

Le résultat de l’exécution de ce script ressemblera à :

Starting namenodes on [hadoop-master]
hadoop-master: Warning: Permanently added 'hadoop-master,172.18.0.2' (ECDSA) to the list of known hosts.
Starting datanodes
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Starting secondary namenodes [hadoop-master]
hadoop-master: Warning: Permanently added 'hadoop-master,172.18.0.2' (ECDSA) to the list of known hosts.

Starting resourcemanager
Starting nodemanagers

Remarque Ces étapes de configuration ne doivent être réalisées qu’une seule fois. Pour relancer le cluster (une fois qu’on a fermé et relancé son ordinateur p. ex.), il suffira

  1. de lancer l’application Docker Desktop, qui lance les daemon Docker.
  2. de lancer la commande suivante :
docker start hadoop-master hadoop-slave1 hadoop-slave2

Vous pouvez alors entrer dans le Namenode :

docker exec -it hadoop-master bash