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 à :
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.