Portfolio / Projets / big-data-hadoop-spark

Big Data · Data Platform · Projet académique

Monter un laboratoire Hadoop & Spark et suivre le chemin réel des traitements.

Le projet assemble HDFS, YARN, Java MapReduce et un cluster Spark standalone dans Docker Compose. Le même WordCount est exécuté en Java puis en PySpark, avant un second job d’agrégation pour calculer une longueur moyenne.

8ConteneursHadoop + Spark
2DataNodesvisibles par HDFS
2WordCountJava + PySpark
5,333Longueur moyennesortie du job de test

Outils & technologies

Docker ComposeHadoop HDFSYARN / Java MapReduceSpark standalonePySpark

Laboratoire conteneurisé sur une seule machine.

01 / Objectif & résultat global

Comprendre concrètement où vont les données lorsqu’un traitement distribué est lancé.

Le laboratoire assemble Hadoop et Spark avec Docker afin de suivre le parcours complet d’un fichier : stockage HDFS, orchestration YARN, exécution MapReduce, puis traitement équivalent avec PySpark.

HDFS2 DataNodes actifs

Le NameNode reconnaît les deux nœuds de stockage et aucun bloc n’est sous-répliqué lors de la validation.

Hadoop2 jobs réussis

WordCount puis Average Word Length apparaissent comme FINISHED / SUCCEEDED dans YARN.

SparkMême WordCount

PySpark retourne exactement les mêmes comptes que le job Java : hadoop 1, hello 2, world 1.

Ce que le lab démontre : pas un benchmark de performance, mais la compréhension et la validation de deux chemins d’exécution distribués différents dans un environnement reproductible.

02 / Architecture

Deux sous-systèmes dans le même environnement Docker.

Docker Compose8 conteneurs de service
Hadoop

Stocker puis exécuter via HDFS / YARN

NameNodeDataNode 1DataNode 2ResourceManagerNodeManagerHistoryServer

Les fichiers résident dans HDFS. Les jobs Java MapReduce sont suivis par YARN.

Spark standalone

Soumettre un job au master puis au worker

Spark MasterSpark WorkerVolume partagé

Le WordCount PySpark est soumis au master Spark et lit le fichier depuis le volume partagé.

Conteneurs Hadoop et Spark actifs dans Docker Desktop
L’environnement réunit les services Hadoop et Spark dans le même projet Docker Compose.
Sortie docker compose ps montrant les services Hadoop et Spark actifs
Les services nécessaires sont démarrés avant d’exécuter les traitements.

Avec les services actifs, il faut d’abord vérifier que le stockage HDFS voit bien les deux nœuds de données.

03 / Stockage HDFS

Le NameNode voit deux DataNodes en service.

HDFS sépare les métadonnées du stockage physique. Le NameNode sait où se trouvent les blocs, tandis que les DataNodes conservent les données. Le laboratoire ajoute un second DataNode afin de manipuler cette séparation plutôt qu’un stockage dans un seul conteneur.

Interface NameNode montrant deux nœuds HDFS en service
La vue NameNode indique deux nœuds en service dans HDFS.
Pourquoi cette vérification compte : si les DataNodes ne sont pas enregistrés auprès du NameNode, placer un fichier dans HDFS ne suffit pas à démontrer que la couche de stockage distribuée fonctionne.

Le stockage étant disponible, le premier traitement peut suivre le chemin Hadoop classique : HDFS, MapReduce, puis sortie HDFS.

04 / Java MapReduce

Un WordCount simple pour suivre toutes les étapes du moteur Hadoop.

Le fichier de contrôle contient hello hadoop hello world. Le mapper transforme chaque mot en paire (mot, 1). Hadoop regroupe ensuite les mêmes clés pendant le shuffle, puis le reducer additionne les valeurs de chaque mot.

Chemin Hadoop

input HDFSMapper Javashuffle / sortReducer Javaoutput HDFS
Sortie Hadoop WordCount : hadoop 1, hello 2, world 1
Sortie du WordCount Java : hello apparaît deux fois, hadoop et world une fois.

Le résultat devient ensuite un point de comparaison : le même calcul est réécrit en PySpark pour vérifier que la logique reste la même avec une autre API d’exécution.

05 / PySpark

Même transformation, autre moteur d’exécution.

Le job PySpark lit le même fichier depuis le volume partagé. flatMap découpe les lignes en mots, map associe chaque mot à 1 et reduceByKey additionne les valeurs par clé. Le Spark Master délègue l’exécution au worker enregistré.

Interface Spark Master montrant un worker actif
Le Spark Master voit un worker actif dans le cluster standalone.
Sortie PySpark WordCount : world 1, hello 2, hadoop 1
Le WordCount PySpark retrouve exactement les mêmes comptes.
Sortie Hadoop WordCount utilisée comme référence
La sortie Hadoop sert de référence pour vérifier le résultat Spark.
Ce que cette comparaison démontre

La logique métier est identique, mais le chemin technique change. Le job Hadoop s’appuie sur HDFS et YARN avec du Java MapReduce. Le job Spark est soumis au master standalone et utilise son worker. Ce n’est pas un benchmark de vitesse entre les deux moteurs.

Après ce contrôle fonctionnel, un second job MapReduce permet de tester une agrégation numérique et de rencontrer un problème de type plus concret.

06 / Débogage réel

Le second job échouait conceptuellement parce que le type de sortie déclaré ne correspondait pas au résultat calculé.

01

Résultat attendu

La longueur moyenne doit être décimale.

02

Problème

Le reducer écrit un DoubleWritable, alors que le driver déclarait encore un IntWritable.

03

Correction

Aligner le contrat de sortie du job sur le type réellement produit, puis reconstruire le JAR.

04

Validation

Le job termine dans YARN et retourne Average Word Length = 5,333333333333333.

Résultat du job Average Word Length
La correction n’est considérée valide qu’une fois le résultat produit et le job marqué comme réussi.

07 / Ce que les preuves confirment

HDFS, MapReduce et Spark validés sur un laboratoire conteneurisé.

PreuveObservationInterprétationPortée
HDFS2 DataNodes actifsstockage distribué reconnuarchitecture
YARN2 jobs SUCCEEDEDorchestration MapReduce opérationnelleHadoop
WordCount1 / 2 / 1Java et PySpark concordentvalidation croisée
Average length5,333333...type de sortie corrigé et résultat produitdebug

Le point important est la cohérence entre les preuves : les interfaces montrent l’état du cluster, les sorties terminal montrent les résultats, et les deux implémentations WordCount donnent le même contenu. Le laboratoire valide donc une chaîne complète, du stockage HDFS à l’orchestration YARN puis à l’exécution MapReduce et Spark, sans prétendre mesurer lequel des deux moteurs est le plus rapide.

08 / Limites

Un laboratoire pédagogique conteneurisé sur une seule machine.

  • Tous les conteneurs tournent sur une seule machine physique : une panne de l’hôte arrête tout le laboratoire.
  • Un seul NodeManager et un seul Spark Worker sont utilisés ; le projet démontre l’orchestration et les chemins de calcul, pas la montée en charge.
  • Aucun benchmark contrôlé ne permet d’affirmer que Spark est plus rapide que MapReduce dans ce projet.
  • Les versions utilisées sont Hadoop 3.2.1 et Spark 2.4.0 dans des images de laboratoire, sans haute disponibilité, Kerberos ni supervision de production.
Portée : la preuve importante est la compréhension et l’exécution des composants, avec des résultats vérifiables, pas une revendication de cluster d’entreprise.

Projet suivant

Détection de menaces réseau : détecter des attaques à partir de statistiques de flux réseau.