Aller au contenu

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 :

check-cluster.sh

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 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
    cd ~/TP_Hadoop/wordcount/
    

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 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 2026-04-26 05:02 input/dracula
    

Ç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 :
    export STREAMINGJAR=$(ls /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-*.jar | head -1)
    echo $STREAMINGJAR
    

RappelHadoop 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) :
    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 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 :

hadoop fs -ls sortie/
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 :

hadoop fs -tail sortie/part-00000
ou voir tout le fichier :
hadoop fs -cat sortie/part-00000
Le résultat doit être exactement le même que lors de la première partie du TP.

⚠ N’oubliez pas ! Entre 2 exécutions, il faut soit utiliser un nouveau nom pour le dossier sortie, soit le supprimer :

hadoop fs -rm -r -f sortie

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
La commande 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 :

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 MapAttempts)
  • Relancez le job avec -D mapred.reduce.tasks=2 : pourquoi y a-t-il alors 2 fichiers part-0000X ? Le résultat global change-t-il ?