Maîtrisez Hadoop par la pratique
Des exercices progressifs couvrant Hadoop, HDFS, YARN et MapReduce — quiz interactifs, problèmes de calcul, coding et questions de réflexion. Chaque exercice est accompagné de sa solution détaillée.
Hadoop Core
Testez votre compréhension des concepts de base de l'architecture Hadoop.
Nommez et décrivez brièvement les 3 composants essentiels de l'écosystème Hadoop de base.
HDFS, YARN, MapReduce.
| Composant | Acronyme signifie… | Rôle principal |
|---|---|---|
| HDFS | Votre réponse… | Votre réponse… |
| YARN | Votre réponse… | Votre réponse… |
| MapReduce | — | Votre réponse… |
| Composant | Acronyme | Rôle |
|---|---|---|
| HDFS | Hadoop Distributed File System | Système de fichiers distribué : divise les fichiers en blocs (128 MB par défaut), les réplique (×3) et les distribue sur les DataNodes du cluster. |
| YARN | Yet Another Resource Negotiator | Gestionnaire de ressources et d'orchestration : alloue CPU/RAM aux applications, planifie et surveille les tâches sur le cluster. |
| MapReduce | — | Modèle de programmation pour le traitement parallèle : phase Map (transformation), Shuffle (tri/groupement), Reduce (agrégation). |
Analyse comparative et cas d'usage réels.
- Un catalogue produits (1M d'articles, consultations en temps réel, mises à jour fréquentes)
- Des logs de clickstream (10 TB/mois, analyse comportementale, reporting mensuel)
Cas 1 — Catalogue produits → SGBD Relationnel (ex: PostgreSQL)
- Transactions ACID requises (cohérence des stocks, prix)
- Latence faible (<10ms) pour les consultations utilisateurs
- Volume gérable (1M lignes = quelques GB)
- Schema strict bénéfique (contraintes d'intégrité)
Cas 2 — Logs clickstream → Hadoop (HDFS + Hive/Spark)
- Volume massif (10 TB/mois → 120 TB/an) impraticable en SGBD
- Traitement batch acceptable (analyse mensuelle)
- Données semi-structurées (JSON logs, pas de schema fixe)
- Coût de stockage : HDFS sur commodity hardware vs SAN/SSD
🎯 3 Critères décisifs :
< quelques TB → SGBD
> 1 TB en croissance → Hadoop
Temps réel → SGBD
Batch/analytique → Hadoop
Schema fixe → SGBD
Schema flexible → Hadoop
HDFS — Hadoop Distributed File System
Calculez l'espace disque occupé par un fichier dans HDFS.
- Taille de bloc :
128 MB - Facteur de réplication :
3 - Cluster de
5 DataNodes
- Combien de blocs ce fichier génère-t-il ?
- Quelle est la taille du dernier bloc ?
- Combien de copies physiques de blocs existent au total ?
- Quel est l'espace disque total occupé sur le cluster ?
⌈ 850 MB ÷ 128 MB ⌉ = ⌈ 6.64 ⌉ = 7 blocs
2. Taille du dernier bloc (bloc 7) :
850 - (6 × 128) = 850 - 768 = 82 MB
⚠️ HDFS n'alloue que l'espace réellement utilisé (≠ 128 MB)
3. Copies physiques totales :
7 blocs × 3 répliques = 21 copies de blocs
4. Espace disque total :
850 MB × 3 (réplication) = 2 550 MB ≈ 2.49 GB
Distribué sur 5 DataNodes → ~510 MB par nœud en moyenne
Comprenez le mécanisme de gestion des métadonnées dans HDFS.
Écrivez un programme Java qui lit un fichier depuis HDFS ligne par ligne.
- Se connecte à un cluster HDFS (
hdfs://namenode:9000) - Lit le fichier
/user/data/ventes.csv - Affiche chaque ligne avec son numéro
- Gère proprement les ressources (try-with-resources)
Configurationcharge les fichiers core-site.xml et hdfs-site.xml automatiquement si dans le classpathfs.open()retourne unFSDataInputStream, wrappé dansInputStreamReaderpour la lecture texte- Le try-with-resources garantit la fermeture du stream même en cas d'exception
- Dépendance Maven :
hadoop-client(version correspondant au cluster)
Calculez la mémoire nécessaire pour le NameNode d'un cluster de production.
- 500 millions de fichiers (petits et grands)
- 2 milliards de blocs
- Facteur de réplication moyen :
3
- Sachant que chaque objet HDFS (fichier ou bloc) consomme ~150 bytes de RAM dans le NameNode, calculez la RAM minimale requise.
- Quelle RAM totale recommandez-vous en production (avec marge de 50%) ?
- Expliquez pourquoi le NameNode est dit "Single Point of Failure" et comment Hadoop 2.x résout ce problème.
Objets = 500M fichiers + 2B blocs = 2 500 000 000 objets
RAM = 2.5 × 10⁹ × 150 bytes = 375 × 10⁹ bytes
= 375 GB ≈ 366 GiB
2. RAM recommandée (marge +50%) :
375 GB × 1.5 = 562 GB → recommander 512 GiB ou 640 GB
(arrondir au serveur disponible supérieur)
Le NameNode stocke en mémoire la totalité de l'arborescence HDFS. Si le NameNode plante, le cluster HDFS devient totalement inaccessible (ni lecture ni écriture possible). C'est un SPOF classique.
Solution Hadoop 2.x — NameNode HA :
- Active/Standby NameNode : 2 NameNodes synchronisés via des JournalNodes (quorum de 3+)
- Le Standby rejoue les EditLogs des JournalNodes en temps réel
- Zookeeper + ZKFC (ZooKeeper Failover Controller) détecte les pannes et déclenche le basculement automatique
- Basculement en ~30–60 secondes (configurable)
YARN — Yet Another Resource Negotiator
Identifiez les responsabilités de chaque démon YARN.
Calculez le nombre de containers et le parallélisme maximal d'un cluster.
- RAM totale :
64 GBdont12 GBréservés pour l'OS et les démons Hadoop - vCPUs :
16 vCPUsdont2réservés pour les démons - Container YARN minimum :
1 vCPU,2 GB RAM
- Quelle est la RAM disponible pour YARN par nœud ?
- Combien de containers de 1 vCPU / 2 GB peut-on lancer par nœud ? (contrainte CPU et RAM)
- Combien de containers en parallèle sur tout le cluster ?
- Si un job MapReduce soumet 200 tâches Map, combien de rounds seront nécessaires ?
64 GB - 12 GB = 52 GB
2. Containers par nœud :
Contrainte CPU : (16 - 2) vCPUs / 1 vCPU = 14 containers
Contrainte RAM : 52 GB / 2 GB = 26 containers
→ Min(14, 26) = 14 containers/nœud (CPU est le goulot)
3. Parallélisme total cluster :
14 containers × 10 nœuds = 140 containers simultanés
4. Rounds pour 200 tâches Map :
⌈ 200 / 140 ⌉ = ⌈ 1.43 ⌉ = 2 rounds
(Round 1: 140 tâches, Round 2: 60 tâches)
Analysez les deux schedulers YARN pour un contexte multi-tenant.
- Le département Recherche : jobs longs (>1h), batchs nocturnes, faible priorité en journée
- Le département Pédagogie : jobs courts des étudiants (<10 min), haute fréquence, importance en journée
- L'administration : jobs critiques rares mais urgents
→ CapacityScheduler recommandé pour ce cas multi-département avec allocations garanties.
✅ Queues dédiées par département
✅ Capacité garantie (ex: 30% Recherche)
✅ Elasticité : peut utiliser les ressources libres
✅ Priorités par queue
✅ ACL d'accès par queue
→ Partage équitable dynamique
→ Préferable si tous les users sont équivalents
→ Moins adapté aux SLA distincts
→ Pools de ressources moins rigides
Configuration de queues proposée (capacity-scheduler.xml) :
MapReduce — Traitement Distribué
Tracez manuellement les phases Map, Shuffle et Reduce sur un petit texte.
- Listez toutes les paires (clé, valeur) émises par la phase Map
- Montrez le résultat du Shuffle & Sort (regroupement par clé)
- Calculez la sortie finale de la phase Reduce
Mapper 1 :
(hadoop, 1), (est, 1), (grand, 1),
(hadoop, 1), (est, 1), (puissant, 1)
Mapper 2 :
(hadoop, 1), (traite, 1), (les, 1),
(données, 1), (et, 1), (est, 1), (rapide, 1)
(données, [1])
(est, [1, 1, 1])
(et, [1])
(grand, [1])
(hadoop, [1, 1, 1])
(les, [1])
(puissant, [1])
(rapide, [1])
(traite, [1])
(données, 1)
(est, 3)
(et, 1)
(grand, 1)
(hadoop, 3)
(les, 1)
(puissant, 1)
(rapide, 1)
(traite, 1)
Implémentez un job MapReduce calculant la note moyenne par matière.
notes.csv) :
Info → 16.67 | Math → 14.00
Tâche : Implémentez les classes
MoyenneMapper et MoyenneReducer en Java.
- Le Mapper reçoit
(offset, ligne_texte)→ émet(matière, note) - Le Reducer reçoit
(matière, [note1, note2, ...])→ calcule et émet la moyenne - Utiliser
DoubleWritable(et nondouble) car Hadoop requiert des types sérialisables (Writable) - Le skip d'en-tête en vérifiant
startsWith("etudiant")est une approche simple ; en production, utilisezMultipleInputsou unTextInputFormatpersonnalisé
Calculez le temps théorique d'un job et identifiez les goulots d'étranglement.
- Débit disque HDFS :
200 MB/spar nœud en lecture - Chaque tâche Map traite un bloc de
128 MB - Capacité du cluster :
100 tâches Map simultanées - Overhead par tâche (démarrage JVM, init) :
5 secondes - Ratio données Shuffle :
30%des données en entrée - Débit réseau inter-nœuds :
1 Gb/spar nœud
- Combien de tâches Map sont nécessaires ?
- Combien de rounds de Map (waves) ?
- Quel est le temps estimé pour la phase Map (lecture + traitement) ?
- Quel est le volume de données shufflé ? Le temps de Shuffle ?
5 TB = 5 × 1024 × 1024 MB = 5 242 880 MB
Tâches = ⌈ 5 242 880 / 128 ⌉ = 40 960 tâches Map
2. Rounds (waves) :
⌈ 40 960 / 100 ⌉ = 410 waves
3. Temps phase Map :
Temps lecture/bloc = 128 MB / 200 MB/s = 0.64 s
Temps/tâche = 0.64 s + 5 s overhead = 5.64 s
Temps total Map ≈ 410 waves × 5.64 s = ≈ 38 min 30 s
4. Shuffle :
Volume = 5 TB × 30% = 1.5 TB
Débit réseau total = 20 nœuds × 1 Gb/s = 20 Gb/s = 2.5 GB/s
Temps Shuffle ≈ 1 536 GB / 2.5 GB/s = ≈ 10 min 14 s
Identifiez la technique d'optimisation adaptée à chaque problème.
Implémentez une jointure entre deux datasets avec MapReduce pur.
nom_client → total_commandes_montant
Implémentez :
- Un
JoinMapperqui lit les deux fichiers (viaMultipleInputs) et tague chaque enregistrement - Un
JoinReducerqui réalise la jointure en mémoire
Exercices Intégrateurs — Architecture Complète
Concevez l'architecture complète d'un système d'analyse de logs web.
- Top 100 pages les plus visitées
- Temps de réponse moyen par endpoint
- Taux d'erreurs HTTP (4xx, 5xx) par heure
- Analyse des bots vs utilisateurs réels
Apache Flume (agents sur chaque serveur web)
→ Channel mémoire → Kafka topic "web-logs"
→ Flume Sink → HDFS
Pourquoi Kafka ? Buffer de découplage, rejeu possible
Format : ORC ou Parquet (compression + columnar)
Partitionnement :
/logs/year=2024/month=01/day=15/hour=09/Réplication : ×3 (standard)
Taille bloc : 256 MB (gros fichiers)
Apache Spark (vs MapReduce)
→ 10-100× plus rapide (in-memory)
→ API DataFrames (SQL-like)
Schedule : Airflow à 2h du matin
Output : tables Hive agrégées
Apache Superset ou Grafana
Connexion via Hive/Presto/Trino
Dashboard auto-refresh à 6h
Alertes email si erreurs > 5%
50 GB/jour → 350 GB/semaine. Avec MapReduce, chaque job écrit sur disque entre chaque phase (Map → Shuffle → Reduce → disque). Spark garde les données en mémoire entre les opérations. Pour des analyses complexes (4 métriques = plusieurs passes), Spark est 5–10× plus rapide ici.
MapReduce resterait pertinent si : données > RAM disponible, opérations simples 1-passe, contraintes de licence ou équipe déjà formée.