Plateforme Big Data End-to-End intégrant ingestion IoT, traitement distribué en temps réel, stockage hybride et Machine Learning pour la prédiction de pollution urbaine.
CityPulse est une réponse technologique aux défis de gestion urbaine. La plateforme simule et ingère des flux de données IoT (Trafic & Pollution) pour fournir une vision 360° de la ville.
Elle implémente une Architecture Lambda Modernisée capable de :
- Ingérer des flux à haute fréquence via Kafka.
- Historiser les données brutes et nettoyées (Data Lake HDFS).
- Entraîner un modèle d'Intelligence Artificielle sur l'historique (Batch).
- Prédire & Alerter en temps réel sur les niveaux de pollution futurs (Streaming).
Le système utilise Spark MLlib (Régression Linéaire) pour prédire le taux de PM2.5 en fonction de la densité du trafic.
Règle d'Alerting Temps Réel :
IF (Pollution_Predict > 80 µg/m³ AND Densité_Trafic > 40)
THEN ALERTE = 'CRITIQUE'
ELSE IF (Pollution_Predict > 50 µg/m³)
THEN ALERTE = 'WARNING'
ELSE ALERTE = 'NORMAL'graph LR
subgraph IoT Source
A[Node-RED] -->|JSON Stream| B(Kafka KRaft)
end
subgraph "Speed Layer (Temps Réel)"
B -->|Subscribe| C{Spark Streaming Gold}
E[Modèle ML HDFS] -.->|Load Model| C
C -->|KPIs + Prédictions| F[(Cassandra)]
end
subgraph "Batch Layer (Historique & ML)"
B -->|Subscribe| D[Spark Streaming Silver]
D -->|Parquet| G[(HDFS Data Lake)]
G -->|Train Data| H[Spark ML Training]
H -->|Save Model| E
end
subgraph Viz
F --> I[Grafana Dashboard]
end
| Domaine | Technologie | Version | Rôle |
|---|---|---|---|
Ingestion |
Apache Kafka | 7.6 (KRaft) | Bus d'événements haute performance (No Zookeeper) |
Simulation |
Node-RED | 3.1 | Générateur de trafic IoT réaliste |
Compute |
Apache Spark | 3.3.0 | Moteur unifié pour Streaming et Batch ML |
ML Engine |
Spark MLlib | 3.3.0 | Algorithme de Régression Linéaire Distribué |
Stockage Froid |
Hadoop HDFS | 3.2.1 | Data Lake (Format Parquet partitionné) |
Stockage Chaud |
Cassandra | 4.1 | Base NoSQL Time-Series pour le temps réel |
Visualisation |
Grafana | Latest | Tableau de bord décisionnel |
Infra |
Docker | 24+ | Déploiement "Infrastructure as Code" |
- Docker Desktop (Linux/Windows WSL2/Mac).
- 4 Go de RAM dédiés à Docker minimum.
git clone https://github.com/8sylla/citypulse.git
cd citypulse
# Lancer le cluster complet (Kafka, Spark Master+Workers, HDFS, Cassandra...)
docker-compose up -dUne fois les conteneurs actifs (vérifier via docker ps), initialisez les bases de données :
# 1. Création Topics Kafka
docker exec citypulse-kafka kafka-topics --create --topic traffic-raw --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
docker exec citypulse-kafka kafka-topics --create --topic pollution-raw --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
# 2. Création Table Cassandra (Avec colonne prédiction ML)
docker exec -it citypulse-cassandra cqlsh -e "
CREATE KEYSPACE IF NOT EXISTS citypulse WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE citypulse;
CREATE TABLE district_stats (
district text, window_end timestamp, avg_speed double, max_density int,
avg_pm25 double, predicted_pm25 double, alert_level text,
PRIMARY KEY (district, window_end)
) WITH CLUSTERING ORDER BY (window_end DESC);"
# 3. Structure HDFS
docker exec citypulse-namenode hdfs dfs -mkdir -p /data/silver /models- Ouvrez Node-RED : http://localhost:1880
- Importez le flux
node-red/flows.json. - Cliquez sur Deploy et activez les injecteurs pour simuler le trafic.
Compilez le code Scala en un "Fat JAR" et envoyez-le au cluster Spark.
sbt clean assembly
docker cp target/scala-2.12/CityPulse-assembly-1.0.jar citypulse-spark-master:/tmp/app.jarNous devons d'abord accumuler des données pour entraîner l'IA.
docker exec -d citypulse-spark-master /spark/bin/spark-submit \
--class citypulse.SilverProcessing \
--master spark://citypulse-spark-master:7077 \
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.3.0 \
/tmp/app.jar⏳ Laissez tourner 5 à 10 minutes pour remplir le Data Lake.
Une fois les données suffisantes, nous entraînons le modèle de prédiction.
docker exec -it citypulse-spark-master /spark/bin/spark-submit \
--class citypulse.ModelTraining \
--master spark://citypulse-spark-master:7077 \
/tmp/app.jarSuccès si : >>> MODÈLE ENTRAINÉ ET SAUVEGARDÉ ! <<<
Le job final qui lit Kafka, charge le modèle IA, prédit et écrit dans Cassandra.
docker exec -it citypulse-spark-master /spark/bin/spark-submit \
--class citypulse.GoldAggregations \
--master spark://citypulse-spark-master:7077 \
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.3.0,com.datastax.spark:spark-cassandra-connector_2.12:3.3.0 \
--conf spark.cassandra.connection.host=citypulse-cassandra \
--conf spark.sql.shuffle.partitions=3 \
/tmp/app.jar- Accédez à http://localhost:3000 (Login:
admin/citypulse). - Configurez la Datasource Cassandra (
citypulse-cassandra:9042). - Créez un dashboard avec la requête suivante pour comparer Réalité vs IA :
SELECT window_end, avg_pm25, predicted_pm25
FROM district_stats
WHERE district = 'Centre'
ALLOW FILTERINGcitypulse/
├── docker-compose.yml # Orchestration complète
├── src/main/scala/citypulse/
│ ├── SilverProcessing.scala # Ingestion & Stockage (Batch Layer Prep)
│ ├── ModelTraining.scala # Machine Learning (Spark MLlib)
│ └── GoldAggregations.scala # Streaming + Inference + Cassandra
├── build.sbt # Dépendances (Spark SQL, Streaming, ML, Kafka)
├── node-red/flows.json # Simulation IoT
└── README.md # DocumentationSYLLA N'faly
Élève Ingénieur - Passionné par le Data Engineering & Big Data
Projet réalisé dans le cadre d'un module académique avancé.

