Wordcount Hadoop
Table des Matières
Map-reduce, avec Hadoop¶
Le mini-cluster simule un environnement de production distribué : un NameNode coordonne les accès aux données, et 2 DataNodes stockent les blocs HDFS et exécutent les tâches map en parallèle sur leurs données locales. C’est ce parallélisme inter-nœuds — et non le parallélisme de cœurs CPU d’une seule machine — qui est au cœur d’Hadoop : le traitement va vers les données, pas l’inverse.
Vérifier que le cluster est prêt¶
Bonne nouvelle — depuis la version 5 de l’image, HDFS et YARN démarrent automatiquement quand on lance le cluster. Plus besoin de formater le disque ni de lancer manuellement
start-dfs.sh/start-yarn.sh.
Une fois entré dans le master (docker compose exec hadoop-master bash), un seul script suffit pour vérifier que tout va bien :
Tu dois voir tous les éléments marqués ✓ (NameNode, ResourceManager, SecondaryNameNode sur le master ; DataNode et NodeManager sur chaque slave ; HDFS et YARN opérationnels). Si un ✗ apparaît, va voir la page de dépannage.
Preparation des fichiers pour wordcount¶
Remarque importante - Le Terminal pointe sur un système Linux qui a son propre mode de stockage de fichiers (appelé ext4). Il est alors possible de créer des dossiers, de déposer des fichiers, de les effacer… avec les commandes Linux traditionnelles (
mkdir,rm…). - 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 parhadoop 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
Ce répertoire est monté depuis ton ordinateur (filesForTP/TP_Hadoop/wordcount/ du repo). Tu peux donc l’éditer dans VS Code sur ton OS, et les modifications apparaissent immédiatement dans le conteneur.
-
La commande
lspermet 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.pyetwc_reducer.py
-
Versez le fichier dracula sur l’espace HDFS (après avoir créé un dossier pour le recevoir)
-
Vérifiez que le fichier a bien été déposé :
ce qui donnera quelque chose comme :
Ça y est, nous sommes prêts à lancer notre premier script map-reduce sous Hadoop !
Wordcount avec Hadoop¶
À partir du Terminal connecté au master, 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. La commande ci-dessous trouve automatiquement le bon fichier
.jar, indépendamment de la version exacte de Hadoop :
Rappel — Hadoop map-reduce fonctionne avec le langage Java ; il faut donc utiliser une bibliothèque capable de transformer des instructions python en instructions Java. C’est le rôle de cette bibliothèque hadoop-streaming-X.Y.Z.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) :
L’option
hadoop jar $STREAMINGJAR -files wc_mapper.py,wc_reducer.py \ -mapper wc_mapper.py -reducer wc_reducer.py \ -input input/dracula -output sortie-filespermet de copier les fichiers nécessaires pour qu’ils soient 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/TP_Hadoop/wordcount/wc_mapper.py,/root/TP_Hadoop/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 :
qui donnera quelque chose comme :Found 2 items
-rw-r--r-- 2 root supergroup 0 2026-04-26 06:58 sortie/_SUCCESS
-rw-r--r-- 2 root supergroup 25 2026-04-26 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 :
N’oubliez pas ! Entre 2 exécutions, il faut soit utiliser un nouveau nom pour le dossier sortie, soit le supprimer :
La présence d’un seul fichier part-00000 montre qu’un seul nœud a été utilisé pour le reducer (le nombre est estimé par le Namenode). Il est possible de forcer le nombre de reducers :
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
hadoop fs -ls sortie/ donnera alors :
Found 3 items
-rw-r--r-- 2 root supergroup 0 2026-04-26 15:24 sortie/_SUCCESS
-rw-r--r-- 2 root supergroup 117444 2026-04-26 15:24 sortie/part-00000
-rw-r--r-- 2 root supergroup 118967 2026-04-26 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. Elles sont déjà exposées par le docker compose :
- Port 9870 — informations du NameNode : http://localhost:9870
- Port 8088 — informations du ResourceManager (YARN) : http://localhost:8088
- Port 8042 — UI du NodeManager slave 1 : http://localhost:8042
- Port 8043 — UI du NodeManager slave 2 : http://localhost:8043
Prenez le temps de naviguer dans les menus après avoir lancé le job wordcount.
À observer dans les UIs
NameNode UI — port 9870 (Utilities → Browse the file system) :
- Combien de blocs HDFS occupe le fichier
dracula? (colonne Block(s)) - Quel est le facteur de réplication affiché ? Pourquoi est-il de 2 et non 3, alors que le cluster a 2 DataNodes ?
YARN ResourceManager UI — port 8088 (cliquez sur le nom du job terminé) :
- Combien de tâches Map et Reduce ont été lancées ?
- Sur quel(s) nœud(s) les tâches Map ont-elles tourné ? (onglet Map → Attempts)
- Relancez le job avec
-D mapred.reduce.tasks=2: pourquoi y a-t-il alors 2 fichierspart-0000X? Le résultat global change-t-il ?