TP 3 – Le fil rouge sur un cluster Standalone + HDFS
Objectif : exécuter le TP 2 sans changer le code métier sur un vrai cluster, avec les données lues depuis
HDFS. Seuls changent --master et le chemin des données.
Le script tp2_cluster.py est le TP 2 corrigé, sans .master() dans le code : le master vient de spark-submit.
hdfs://namenode:8020/data.Partie A – Cluster Standalone sur votre poste (sans Docker, 20 min)
Section intitulée « Partie A – Cluster Standalone sur votre poste (sans Docker, 20 min) »Linux, macOS ou WSL2, depuis la racine du dépôt, venv activé :
bash jour1/TP3_cluster/start_cluster_local.sh# → Master : spark://127.0.0.1:7077, UI http://localhost:8080 — 1 worker, 2 cœursspark-submit --master spark://127.0.0.1:7077 jour1/TP3_cluster/tp2_cluster.py data- Ouvrez http://localhost:8080 : combien de workers ? de cœurs ? Repérez votre application « TP3-cluster ».
- Dans l’UI de l’application (port 4040 pendant l’exécution, 4041 si un notebook est encore ouvert), retrouvez les stages du TP 2.
- Bonus : lancez un second worker (commande affichée par le script) et relancez le
spark-submit. Dans l’UI du master, comment les tâches se répartissent-elles ? Le job est-il plus rapide ? Sur un portable de 2 à 4 cœurs avec 120 000 lignes, souvent non : les deux workers se partagent les mêmes cœurs physiques et le coût de coordination dépasse le gain. Un cluster ne paie qu’avec de vraies machines et de vrais volumes.
Pourquoi le chemin
datafonctionne-t-il ? Ici, driver et workers partagent le même disque. Sur un vrai cluster, chaque worker doit voir les données : d’où HDFS (partie B) ou un stockage objet (S3, ADLS).
Arrêt : bash jour1/TP3_cluster/stop_cluster_local.sh
Pourquoi
spark-classet passtart-master.sh? Les scriptssbin/ne sont plus livrés avecpip install pyspark. Avec une distribution Spark complète (tar.gz),sbin/start-master.shpuissbin/start-worker.sh spark://<hôte>:7077font la même chose.
Partie B – Cluster + HDFS en conteneurs (30 min)
Section intitulée « Partie B – Cluster + HDFS en conteneurs (30 min) »Prérequis : Docker Desktop (ou Docker Engine) avec 4 Go de RAM alloués.
cd jour1/TP3_clustercp .env.example .env # puis alignez SPARK_VERSION sur votre `pip show pyspark`docker compose up -ddocker compose ps # namenode, datanode, spark-master, spark-worker-1 : tous « running »- HDFS – déposer les données (le dépôt est monté dans
/workspace) :Ouvrez http://localhost:9870 → Utilities › Browse the file system. Combien de blocs pourFenêtre de terminal docker compose exec namenode hdfs dfs -mkdir -p /datadocker compose exec namenode hdfs dfs -put /workspace/data/trips.csv /workspace/data/taxi_zone_lookup.csv /datadocker compose exec namenode hdfs dfs -ls /datatrips.csv? (12 Mo < 128 Mo → 1 bloc, réplication 1.) - Spark – lancer le job sur le cluster, données lues depuis HDFS :
Fenêtre de terminal docker compose exec spark-master spark-submit --master spark://spark-master:7077 \/workspace/jour1/TP3_cluster/tp2_cluster.py hdfs://namenode:8020/data - http://localhost:8080 : l’application, le worker, les cœurs utilisés.
- Bonus : décommentez
spark-worker-2dansdocker-compose.yml,docker compose up -d, relancez : combien de cœurs maintenant ?
Arrêt : docker compose down -v
Lire la configuration
Section intitulée « Lire la configuration »| Fichier | Rôle |
|---|---|
conf/core-site.xml | Où est le système de fichiers : fs.defaultFS = hdfs://namenode:8020 |
conf/hdfs-site.xml | Comment stocker : dfs.replication = 1, taille des blocs, répertoires |
conf/hadoop.env | Les mêmes propriétés, au format attendu par l’image apache/hadoop |
Mode dégradé
Section intitulée « Mode dégradé »- Docker absent ou interdit : faites uniquement la partie A, tout tourne avec le PySpark déjà installé. Les
données se lisent en local :
tp2_cluster.py data. - HDFS ne démarre pas :
docker compose down -vpuisup -d; sinon partie A et explication de HDFS sur l’UI du formateur.
Blocages fréquents
Section intitulée « Blocages fréquents »| Symptôme | Cause probable | Solution |
|---|---|---|
Connection refused sur 7077 | Master pas démarré ou IP différente | SPARK_LOCAL_IP=127.0.0.1, vérifier http://localhost:8080 |
Executors qui meurent, Python in worker has different version | Python du worker ≠ Python du driver | export PYSPARK_PYTHON=$(which python) avant de lancer le worker |
Incompatible Spark version | pyspark (pip) ≠ image Docker | Aligner SPARK_VERSION dans .env |
Permission denied sur HDFS | Droits HDFS | dfs.permissions.enabled=false est déjà dans hadoop.env ; sinon hdfs dfs -chmod -R 777 /data |
| Port 8080 déjà pris | Autre service | --webui-port 8081 dans le script / ports du compose |
- Un participant présente son cluster et son UI master.
- Que se passe-t-il si un worker s’arrête pendant le job ? Les tâches sont relancées ailleurs, les partitions recalculées grâce à la lignée.
- Pourquoi un fichier découpé en blocs se lit-il plus vite ? Un bloc = une tâche, en parallèle, sur la machine qui le détient.
- À retenir : le Driver planifie, les Executors exécutent, HDFS stocke.
Dépôt des participants : formations2026/formation-spark-ml (branche participants)
Contenu pédagogique © Ambient IT · 140 Avenue Jean Lolive, 93500 Pantin · formation@ambient-it.net · +33 (0)1 48 10 09 46
Organisme de formation enregistré sous le numéro 11 75 54743 75. Cet enregistrement ne vaut pas agrément de l'État.