Travaux Pratiques
Déploiement d’un Cluster Hadoop
avec Docker sur Windows
[hadoop-master]
NameNode + ResourceManager
↓
[hadoop-worker1] [hadoop-worker2]
DataNode + NodeManager DataNode + NodeManager
Réalisé par : Bahloul Fares et Ben Rhaiem Mohamed
Année : 2025 – 2026
Date : 26 avril 2026
Hadoop 3.5.0 • Docker • Java 17 • YARN • HDFS • MapReduce
Table des matières
1 Introduction 3
1.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objectifs du TP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Outils utilisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Architecture du Cluster 4
2.1 Vue d’ensemble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Rôles des composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.1 NameNode (Master) . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.2 DataNode (Workers) . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.3 ResourceManager (Master) . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.4 NodeManager (Workers) . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Ports exposés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Configuration Technique 6
3.1 Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 Docker Compose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3 Script [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.4 Fichiers de configuration XML . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4.1 [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4.2 [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4.3 [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.4.4 [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4 Déploiement du Cluster 10
4.1 Lancement du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.2 Vérification de l’état des conteneurs . . . . . . . . . . . . . . . . . . . . . . 10
4.3 Interfaces web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5 Initialisation HDFS 13
5.1 Principe de HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2 Commandes d’initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.3 Ce qui se passe lors du put . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
6 Exécution du Job MapReduce 14
6.1 Principe de MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.2 Exemple avec WordCount . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.3 Commande exécutée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.4 Logs du job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6.5 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1
TP Big Data Cluster Hadoop avec Docker
7 Analyse des Résultats 16
7.1 Compteurs MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
7.2 Observations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
8 Conclusion 17
8.1 Bilan du TP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8.2 Avantages de l’approche Docker . . . . . . . . . . . . . . . . . . . . . . . . 17
8.3 Limites observées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8.4 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
A Structure du Projet 18
B Commandes de référence Windows CMD 19
2
1. Introduction
1.1 Contexte
Le Big Data désigne l’ensemble des technologies et méthodes permettant de traiter
des volumes de données massifs, dépassant les capacités des outils traditionnels. Face à
l’explosion des données générées chaque jour, des frameworks distribués comme Apache
Hadoop ont été développés pour répondre à ces besoins.
1.2 Objectifs du TP
Ce travail pratique a pour objectifs de :
— Déployer un cluster Hadoop multi-nœuds avec Docker
— Comprendre l’architecture HDFS (stockage distribué)
— Comprendre le fonctionnement de YARN (gestion des ressources)
— Exécuter un premier job MapReduce (WordCount)
— Analyser les résultats et les logs du cluster
1.3 Outils utilisés
Outil Version Rôle
Apache Hadoop 3.5.0 Framework Big Data
Docker Desktop Latest Conteneurisation
Docker Compose v2 Orchestration multi-conteneurs
Java (Eclipse Temurin) 17-JRE Runtime Hadoop
Windows 11 Système hôte
Table 1.1 – Outils utilisés dans ce TP
3
2. Architecture du Cluster
2.1 Vue d’ensemble
Le cluster déployé est composé de 3 conteneurs Docker communicant via un réseau
virtuel hadoop-net. Chaque conteneur simule un nœud physique d’un vrai datacenter.
hadoop-master
NameNode + ResourceManager
hadoop-net (bridge)
hadoop-worker1 hadoop-worker2
DataNode + NodeManager DataNode + NodeManager
Figure 2.1 – Architecture du cluster Hadoop sur Docker
2.2 Rôles des composants
2.2.1 NameNode (Master)
Le NameNode est le cerveau de HDFS. Il ne stocke pas les données, mais conserve
la métadonnée de tous les fichiers :
— Quel fichier existe dans HDFS
— Sur quels DataNodes ses blocs sont stockés
— Le facteur de réplication de chaque bloc
2.2.2 DataNode (Workers)
Les DataNodes stockent physiquement les blocs de données sur le disque. Ils en-
voient régulièrement un heartbeat au NameNode pour signaler qu’ils sont actifs.
2.2.3 ResourceManager (Master)
Le ResourceManager est le chef d’orchestre de YARN. Il reçoit les demandes de
jobs MapReduce et distribue les tâches aux NodeManagers selon les ressources disponibles.
4
TP Big Data Cluster Hadoop avec Docker
2.2.4 NodeManager (Workers)
Chaque NodeManager exécute les tâches Map et Reduce sur son nœud local et
reporte leur avancement au ResourceManager.
2.3 Ports exposés
Port Composant Description
9870 NameNode Web UI État HDFS, blocs, DataNodes
8088 ResourceManager UI Jobs YARN, ressources
9000 HDFS RPC Communication inter-nœuds
9864 DataNode worker1 Interface DataNode
9865 DataNode worker2 Interface DataNode
8042 NodeManager worker1 Interface NodeManager
8043 NodeManager worker2 Interface NodeManager
Table 2.1 – Ports exposés du cluster
5
3. Configuration Technique
3.1 Dockerfile
Le Dockerfile définit l’image commune utilisée par les 3 conteneurs :
1 FROM eclipse - temurin :17 - jre
2
3 ENV HADOOP_VERSION =3.5.0
4 ENV HADOOP_HOME =/ opt / hadoop
5 ENV JAVA_HOME =/ opt / java / openjdk
6 ENV PATH = $PATH :/ opt / hadoop / bin :/ opt / hadoop / sbin
7
8 # Installation des dependances systeme
9 RUN apt - get update && apt - get install -y --no - install - recommends \
10 bash ca - certificates curl netcat - openbsd procps \
11 && rm - rf / var / lib / apt / lists /*
12
13 # Telechargement et installation de Hadoop
14 RUN curl - fsSL \
15 " https :// downloads . apache . org / hadoop / common / hadoop -3.5.0/ hadoop
-3.5.0. tar . gz " \
16 -o / tmp / hadoop . tar . gz \
17 && tar - xzf / tmp / hadoop . tar . gz -C / opt \
18 && ln -s "/ opt / hadoop -3.5.0" / opt / hadoop \
19 && rm / tmp / hadoop . tar . gz
20
21 RUN mkdir -p / data / nn / data / dn / data / tmp / config
22 COPY entrypoint . sh / entrypoint . sh
23 RUN chmod + x / entrypoint . sh
24 ENTRYPOINT ["/ entrypoint . sh "]
Listing 3.1 – Dockerfile du cluster Hadoop
3.2 Docker Compose
Le fichier [Link] orchestre les 3 services :
1 services :
2 master :
3 build : { context : . }
4 container_name : hadoop - master
5 hostname : master
6
TP Big Data Cluster Hadoop avec Docker
6 environment :
7 NODE_ROLE : master
8 ports :
9 - "9870:9870"
10 - "8088:8088"
11 - "9000:9000"
12 networks :
13 hadoop - net :
14 aliases : [ master ]
15 volumes :
16 - ./ config :/ config : ro
17 - nn_data :/ data / nn
18 - master_tmp :/ data / tmp
19
20 worker1 :
21 build : { context : . }
22 container_name : hadoop - worker1
23 hostname : worker1
24 environment :
25 NODE_ROLE : worker
26 depends_on : [ master ]
27 ports :
28 - "9864:9864"
29 - "8042:8042"
30 ...
31
32 networks :
33 hadoop - net :
34 name : hadoop - net
35 driver : bridge
36
37 volumes :
38 nn_data :
39 dn1_data :
40 dn2_data :
41 master_tmp :
42 worker1_tmp :
43 worker2_tmp :
Listing 3.2 – [Link]
3.3 Script [Link]
Ce script détermine le rôle de chaque conteneur au démarrage selon la variable d’en-
vironnement NODE_ROLE :
1 # !/ bin / bash
2 set -e
3
4 wait_for () {
5 local host = $1 port = $2
7
TP Big Data Cluster Hadoop avec Docker
6 while ! nc -z " $host " " $port " 2 >/ dev / null ; do
7 sleep 2
8 done
9 }
10
11 # Copier les configs XML
12 cp / config /*. xml " $HADOOP_HOME / etc / hadoop / "
13
14 case " $NODE_ROLE " in
15 master )
16 if [ ! -d / data / nn / current ]; then
17 hdfs namenode - format - force - nonInteractive
18 fi
19 hdfs namenode &
20 yarn resourcemanager &
21 tail -f / dev / null
22 ;;
23 worker )
24 wait_for master 9000
25 hdfs datanode &
26 yarn nodemanager &
27 tail -f / dev / null
28 ;;
29 esac
Listing 3.3 – [Link]
3.4 Fichiers de configuration XML
3.4.1 [Link]
1 < configuration >
2 < property >
3 < name > fs . defaultFS </ name >
4 < value > hdfs: // master:9000 </ value >
5 </ property >
6 < property >
7 < name > hadoop . tmp . dir </ name >
8 < value >/ data / tmp </ value >
9 </ property >
10 </ configuration >
Listing 3.4 – [Link]
3.4.2 [Link]
1 < configuration >
2 < property >
3 < name > dfs . replication </ name >
8
TP Big Data Cluster Hadoop avec Docker
4 < value >3 </ value >
5 </ property >
6 < property >
7 < name > dfs . namenode . name . dir </ name >
8 < value >/ data / nn </ value >
9 </ property >
10 < property >
11 < name > dfs . datanode . data . dir </ name >
12 < value >/ data / dn </ value >
13 </ property >
14 </ configuration >
Listing 3.5 – [Link]
3.4.3 [Link]
1 < configuration >
2 < property >
3 < name > yarn . resourcemanager . hostname </ name >
4 < value > master </ value >
5 </ property >
6 < property >
7 < name > yarn . nodemanager . aux - services </ name >
8 < value > mapreduce_shuffle </ value >
9 </ property >
10 < property >
11 < name > yarn . nodemanager . resource . memory - mb </ name >
12 < value > 2048 </ value >
13 </ property >
14 </ configuration >
Listing 3.6 – [Link]
3.4.4 [Link]
1 < configuration >
2 < property >
3 < name > mapreduce . framework . name </ name >
4 < value > yarn </ value >
5 </ property >
6 < property >
7 < name > mapreduce . application . classpath </ name >
8 < value >$ HADOOP_HOME / share / hadoop / mapreduce /* </ value >
9 </ property >
10 </ configuration >
Listing 3.7 – [Link]
9
4. Déploiement du Cluster
4.1 Lancement du cluster
1 d:
2 cd " D :\ Mastere \ Semestre2 \ BIG DATA \ tp "
3 docker compose up -d -- build
Listing 4.1 – Construction et lancement du cluster
4.2 Vérification de l’état des conteneurs
1 NAME IMAGE SERVICE STATUS PORTS
2 hadoop - master tp - master master Up 7 minutes
[Link]:9870 - >9870/ tcp
3 [Link]:8088 - >8088/
tcp
4 hadoop - worker1 tp - worker1 worker1 Up 7 minutes
[Link]:9864 - >9864/ tcp
5 hadoop - worker2 tp - worker2 worker2 Up 7 minutes
[Link]:9865 - >9864/ tcp
Listing 4.2 – Résultat de docker compose ps
✓ Résultat : Les 3 conteneurs sont en statut Up, le cluster est opérationnel.
4.3 Interfaces web
URL Description
[Link] NameNode — état HDFS, DataNodes connectés
[Link] ResourceManager — jobs YARN en cours
[Link] DataNode worker1
[Link] DataNode worker2
Table 4.1 – Interfaces web du cluster
10
TP Big Data Cluster Hadoop avec Docker
Figure 4.1 – Interface NameNode — [Link]
Figure 4.2 – Interface ResourceManager — [Link]
11
TP Big Data Cluster Hadoop avec Docker
Figure 4.3 – Interface DataNode worker1 — [Link]
12
5. Initialisation HDFS
5.1 Principe de HDFS
HDFS (Hadoop Distributed File System) est le système de fichiers distribué de Hadoop.
Il repose sur trois principes fondamentaux :
1. Découpage en blocs : chaque fichier est divisé en blocs de 128 Mo
2. Réplication : chaque bloc est copié sur plusieurs DataNodes (ici [Link]=2)
3. Tolérance aux pannes : si un nœud tombe, les données restent accessibles via
les réplicas
5.2 Commandes d’initialisation
1 docker compose exec master hdfs dfs - mkdir -p / tmp
2 docker compose exec master hdfs dfs - chmod 1777 / tmp
3 docker compose exec master hdfs dfs - mkdir -p / user / root / input
4 docker compose exec master bash -c \
5 " echo ’ bonjour hadoop docker bonjour tp ’ > / tmp / test . txt "
6 docker compose exec master hdfs dfs - put -f / tmp / test . txt / user /
root / input /
Listing 5.1 – Initialisation de HDFS
5.3 Ce qui se passe lors du put
Quand on uploade [Link] dans HDFS :
1. Le client contacte le NameNode pour créer l’entrée du fichier
2. Le NameNode désigne les DataNodes qui vont stocker les blocs
3. Le fichier est copié sur 2 DataNodes (worker1 et worker2)
4. Le NameNode enregistre la localisation des blocs
13
6. Exécution du Job MapReduce
6.1 Principe de MapReduce
MapReduce divise le traitement en 3 phases :
Phase Qui Ce qui se passe
Map Workers Lit les données et émet des paires (clé, valeur)
Shuffle Hadoop Regroupe automatiquement par clé
Reduce Workers Agrège les valeurs par clé
Table 6.1 – Les 3 phases de MapReduce
6.2 Exemple avec WordCount
Entrée : "bonjour hadoop docker bonjour tp"
Phase Map — chaque mot devient une paire (mot, 1) :
(bonjour, 1) (hadoop, 1) (docker, 1) (bonjour, 1) (tp, 1)
Phase Shuffle — regroupement par clé :
bonjour → [1, 1] docker → [1] hadoop → [1] tp → [1]
Phase Reduce — somme par clé :
bonjour → 2 docker → 1 hadoop → 1 tp → 1
6.3 Commande exécutée
1 docker compose exec master bash -c \
2 " hadoop jar $HADOOP_HOME / share / hadoop / mapreduce / \
3 hadoop - mapreduce - examples -*. jar \
4 wordcount / user / root / input / user / root / output "
Listing 6.1 – Lancement du job WordCount
14
TP Big Data Cluster Hadoop avec Docker
6.4 Logs du job
1 INFO mapreduce . Job : map 0% reduce 0%
2 INFO mapreduce . Job : map 100% reduce 0%
3 INFO mapreduce . Job : map 100% reduce 100%
4 INFO mapreduce . Job : Job job_1777018134744_0001 completed
successfully
Listing 6.2 – Extrait des logs MapReduce
6.5 Résultat obtenu
1 docker compose exec master hdfs dfs - cat / user / root / output / part -r
-00000
2
3 bonjour 2
4 docker 1
5 hadoop 1
6 tp 1
Listing 6.3 – Résultat final du WordCount
✓ Résultat correct :Le mot bonjour apparaît 2 fois (présent deux fois dans la
phrase), les autres mots apparaissent chacun 1 fois.
15
7. Analyse des Résultats
7.1 Compteurs MapReduce
L’analyse des compteurs retournés par le job nous donne :
Compteur Valeur Signification
Map input records 1 1 ligne lue en entrée
Map output records 5 5 mots émis par le Map
Combine output records 4 4 mots uniques après combinaison locale
Reduce input groups 4 4 groupes reçus par le Reduce
Reduce output records 4 4 mots uniques en sortie finale
HDFS bytes read 141 Données lues depuis HDFS
HDFS bytes written 33 Données écrites dans HDFS
CPU time (ms) 2310 Temps CPU total utilisé
Table 7.1 – Analyse des compteurs du job WordCount
7.2 Observations
— Le job a utilisé 1 Map task et 1 Reduce task (fichier petit)
— Sur de gros fichiers, Hadoop créerait plusieurs Map tasks en parallèle
— Le Combiner a réduit bonjour:[1,1] en bonjour:2 avant l’envoi au Reduce (op-
timisation réseau)
— Les 2 DataNodes ont bien participé au stockage (replication=2)
16
8. Conclusion
8.1 Bilan du TP
Ce TP a permis de :
— Déployer un cluster Hadoop complet avec 3 nœuds sur une machine locale
— Comprendre l’architecture HDFS (NameNode + DataNodes)
— Comprendre YARN (ResourceManager + NodeManagers)
— Exécuter un job MapReduce de bout en bout
— Analyser les logs et les compteurs du job
8.2 Avantages de l’approche Docker
Avantage Détail
Portabilité Le même cluster fonctionne sur Windows, Mac, Linux
Isolation Chaque nœud est indépendant
Reproductibilité Un seul docker compose up pour tout lancer
Facilité Pas besoin d’installer Hadoop sur la machine hôte
Table 8.1 – Avantages de Docker pour Hadoop
8.3 Limites observées
— Ressources limitées (RAM, CPU) car tout tourne sur un seul PC
— Le facteur de réplication [Link]=2 est le minimum pour la tolérance aux
pannes (en production : 3)
— MapReduce est moins rapide que Spark pour les traitements itératifs
8.4 Perspectives
En prolongement de ce TP, il serait intéressant de :
— Tester avec un fichier plus grand (plusieurs Mo ou Go)
— Écrire un job MapReduce personnalisé en Java
— Comparer les performances avec Apache Spark
— Déployer le cluster sur des machines physiques réelles
17
A. Structure du Projet
1 tp /
2 |-- Dockerfile
3 |-- docker - compose . yml
4 |-- entrypoint . sh
5 |-- commandes - hadoop - windows . md
6 ‘-- config /
7 | - - core - site . xml
8 | - - hdfs - site . xml
9 | - - yarn - site . xml
10 ‘-- mapred - site . xml
Listing A.1 – Arborescence du projet
18
B. Commandes de référence Windows
CMD
1 :: Aller dans le dossier
2 d:
3 cd " D :\ Mastere \ Semestre2 \ BIG DATA \ tp "
4
5 :: Lancer le cluster
6 docker compose up -d -- build
7
8 :: Verifier les conteneurs
9 docker compose ps
10
11 :: Initialiser HDFS
12 docker compose exec master hdfs dfs - mkdir -p / tmp
13 docker compose exec master hdfs dfs - chmod 1777 / tmp
14 docker compose exec master hdfs dfs - mkdir -p / user / root / input
15 docker compose exec master bash -c " echo ’ bonjour hadoop docker
bonjour tp ’ > / tmp / test . txt "
16 docker compose exec master hdfs dfs - put -f / tmp / test . txt / user /
root / input /
17
18 :: Lancer WordCount
19 docker compose exec master bash -c " hadoop jar $HADOOP_HOME / share /
hadoop / mapreduce / hadoop - mapreduce - examples -*. jar wordcount / user
/ root / input / user / root / output "
20
21 :: Voir le resultat
22 docker compose exec master hdfs dfs - cat / user / root / output / part -r
-00000
23
24 :: Supprimer output ( avant de relancer )
25 docker compose exec master hdfs dfs - rm -r / user / root / output
26
27 :: Arreter le cluster
28 docker compose down
29
30 :: Tout reinitialiser
31 docker compose down -v -- remove - orphans
32 docker compose up -d -- build -- force - recreate
Listing B.1 – Toutes les commandes Windows CMD
19