Table des Matières



Map-reduce, avec Hadoop

Étant donnée l’installation précédente, nous allons exploiter le parallélisme de votre processeur, souvent constitué de 8 cœurs, et donc susceptible de lancer 8 instructions en parallèle. Parmi ces 8 cœurs, nous n’en exploiterons que 3 (1 pour le Namenode et 2 pour les Datanodes), le dernier cœur étant à disposition de votre machine pour toutes les autres tâches.

Dans un premier temps exécutez la commande suivante

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

qui formate le disque dur hdfs. À ne faire que la première fois que vous rentrez dans le le Namenode.

Lancement du daemon Hadoop

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

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

Preparation des fichiers pour wordcount

Remarque importante Le Terminal pointe sur un système Linux qui a son propre mode de stockage de fichier (appelé ext3). Il est alors possible de créer des dossiers, de déposer des fichiers, de les effacer… avec les commandes Linux traditionnelles (mkdir, rm…). Notons qu’il n’existe pas d’éditeur de texte intégré au container que nous venons d’installer (pour écrire les scripts python), donc nous aurons recours à une astuce décrite ci-dessous.
C’est sur cet espace que nous stockerons les scripts Python map-reduce qui seront exécutés par Hadoop. Par contre, les fichiers volumineux, ceux pour lesquels nous déploierons des algorithmes de traitement, seront stockés sur une partie de votre disque dur gérée par HDFS (Hadoop Distributed File System). À l’aide de commandes commençant par hadoop fs - + commande”, il est possible de créer des dossiers sur HDFS, de copier des fichiers depuis Linux vers HDFS, et de rapatrier des fichiers depuis HDFS vers Linux.

Laissez-vous guider…

  • Depuis le Terminal, déplacez-vous dans le répertoire suivant bash cd TP_Hadoop/wordcount/

  • La commande ls permet de constater que le répertoire contient notamment

    • le fichier dracula : contient le livre dracula au format texte, libre de droits
    • les scripts python : wc_mapper.py et wc_reducer.py
  • Versez le fichier dracula sur l’espace HDFS (après avoir créé un dossier pour le recevoir)

hadoop fs -mkdir -p input
hadoop fs -put dracula input

Vérifiez que le fichier a bien été déposé:

hadoop fs -ls input

ce qui donnera quelque chose comme:

Found 1 items
-rw-r--r--   2 root supergroup     844505 2020-10-16 05:02 input/dracula

Ça y est, nous sommes prêts à lancer notre premier script map-reduce sous Hadoop!

Wordcount avec Hadoop

À partir du premier Terminal, nous allons donc lancer les scripts permettant de compter le nombre de mots sur le fichier du livre dracula.

  • Tout d’abord, stockez le lien vers la librairie permettant de programmer avec python dans une variable système :
export STREAMINGJAR='/usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.4.1.jar'

Rappel Hadoop map-reduce fonctionne avec le langage Java ; il faut donc utiliser une bibliothèque capable de transformer des instructions python en instruction Java. C’est le rôle de cette bibliothèque hadoop-streaming-3.3.2.jar (on appelle cela un wrapper). - Ensuite, lancez le job Hadoop avec l’instruction suivante (copiez tout le bloc d’instructions et collez-le dans le Terminal):

hadoop jar $STREAMINGJAR -files wc_mapper.py,wc_reducer.py \
  -mapper wc_mapper.py -reducer wc_reducer.py \
  -input input/dracula -output sortie

L’option -files permet de copier les fichiers nécessaires pour qu’ils soit exécutés sur tous les nœuds du cluster.

Si jamais la commande ne fonctionnait pas correctement, vous pouvez essayer celle-ci:

hadoop jar $STREAMINGJAR -files /root/wordcount/wc_mapper.py,/root/wordcount/wc_reducer.py \
  -mapper "python wc_mapper.py" -reducer "python wc_reducer.py" \
  -input input/dracula -output sortie

Le résultat du comptage de mots est stocké dans le dossier sortie sous HDFS. Vous pouvez voir son contenu en lançant la commande:

hadoop fs -ls sortie/

qui donnera quelque chose comme

Found 2 items
-rw-r--r--   2 root supergroup          0 2020-10-16 06:58 sortie/_SUCCESS
-rw-r--r--   2 root supergroup         25 2020-10-16 06:58 sortie/part-00000

Le premier fichier _SUCCESS est un fichier vide (0 octet!), dont la simple présence indique que le job s’est terminé avec succès. Le second fichier part-00000 contient le résultat de l’algorithme. Vous pouvez visualiser les dernières lignes du fichier avec la commande :

hadoop fs -tail sortie/part-00000

ou voir tout le fichier avec la commande :

hadoop fs -cat sortie/part-00000

Le résultat devrait être exactement le même que lors de la première partie du TP.

Remarque - N’oubliez pas! : Entre 2 exécutions, il faut soit utiliser un nouveau nom pour le dossier sortie, soit le supprimer de la manière suivante :

hadoop fs -rm -r -f sortie

La présence d’un seul fichier part-0000x montre qu’un seul nœud a été utilisé pour le reducer (le nombre de nœuds est estimé par le Namenode). Il est possible de forcer le nombre de reducer :

hadoop jar $STREAMINGJAR -D mapred.reduce.tasks=2 \
  -files wc_mapper.py,wc_reducer.py \
  -input input/dracula -output sortie \
  -mapper wc_mapper.py -reducer wc_reducer.py

La commande

hadoop fs -ls sortie/

donnera alors

Found 3 items
-rw-r--r--   2 root supergroup          0 2020-10-17 15:24 sortie/_SUCCESS
-rw-r--r--   2 root supergroup     117444 2020-10-17 15:24 sortie/part-00000
-rw-r--r--   2 root supergroup     118967 2020-10-17 15:24 sortie/part-00001

Monitoring du cluster et des jobs

Hadoop offre plusieurs interfaces web pour pouvoir observer le comportement de ses différentes composantes. Vous pouvez afficher ces pages en local sur votre machine grâce à l’option -p de la commande docker run que nous avons utilisée précédemment.

  • Le port 9870 permet d’afficher les informations de votre Namenode.
  • Le port 8088 permet d’afficher les informations du resource manager (appelé Yarn) et visualiser le comportement des différents jobs.

Une fois votre cluster lancé et prêt à l’emploi, utilisez votre navigateur préféré pour observer la page http://localhost:9870. Attention : lors de l’installation, certains étudiants auront du supprimer le mapping de ce port, ils ne leur sera donc pas possible de visualiser la page, semblable à :

interface 9870

Prenez le temps de naviguer dans les menus et d’observer les informations indiquées.

Vous pouvez également visualiser l’avancement et les résultats de vos jobs (map-reduce ou autre) en allant à l’adresse http://localhost:8088. Prenez le temps là-aussi de naviguer dans les menus et d’observer les informations indiquées.