Une entreprise de e-commerce souhaite prédire la probabilité de retour d’un produit après un achat, afin d’optimiser ses recommandations et ses stocks. L’objectif est d’industrialiser ce modèle de machine learning dans un pipeline de traitement distribué (PySpark), avec un focus sur la testabilité et la maintenabilité grâce à une architecture hexagonale.
- Domaine : logique métier indépendante (entités, services de prédiction, validation).
- Application : orchestration, cas d’usage (entraînement, prédiction, scoring).
- Infrastructure : persistance (HDFS, S3, DB), lecture/écriture de fichiers, interaction avec Spark, modèles sérialisés, etc.
- Ports (interfaces) : abstractions vers l’intérieur (use cases) ou l’extérieur (adaptateurs).
- Ingestion des données depuis un data lake (S3 ou HDFS).
- Pré-traitement et feature engineering (PySpark).
- Entraînement du modèle (scikit-learn).
- Sérialisation du modèle (MLflow, Pickle ou Joblib).
- API ou Batch de prédiction (Spark ou REST Flask/FastAPI).
- Monitoring / Logging (MLflow + logs PySpark).
- Tests automatisés (Pytest avec mocks sur l’infrastructure).
| Besoin | Outil(s) |
|---|---|
| Traitement distribué | PySpark |
| Modélisation | scikit-learn |
| Sérialisation du modèle | MLflow / Joblib |
| Orchestration | Luigi |
| Architecture | Clean / Hexagonale |
| Tests | pytest + unittest.mock |
| CI/CD | GitHub Actions |
| Packaging | Poetry |
| Lint | Ruff |
| Typage | mypy |
| Logs | loguru |
- Créer des credentials sur Kaggle, et obtenir des clés API.
- Créer le fichier
.envà partir du fichier.env.dist
Enfin :
make build
make up
- Minio => http://localhost:9001/
- MLflow => http://localhost:5000/
- Luigi (à activer) => http://localhost:8082/
- Python 3.12
- Poetry pour gérer les dépendances
- Java 21 recommandé
⚠️ Java 24 non supporté par Hadoop/Spark → UnsupportedOperationException: getSubject)
Ajoute JAVA_HOME dans ton environnement :
$env:JAVA_HOME = "C:\Program Files\Java\jdk-21"
$env:Path = "$env:JAVA_HOME\bin;$env:Path"
$env:MINIO_ENDPOINT="http://localhost:9000"
$env:MINIO_ACCESS_KEY="minio"
$env:MINIO_SECRET_KEY="minio123"
$env:KAGGLE_USERNAME="mickaelandrieu"
$env:KAGGLE_KEY="d929b44284f3ea32a994136a87fcd365"
$env:AWS_ACCESS_KEY_ID="minio"
$env:AWS_SECRET_ACCESS_KEY="minio123"
$env:LUIGI_S3_ENDPOINT="http://localhost:9000"
$env:MLFLOW_S3_ENDPOINT_URL="http://localhost:9000"
$env:AWS_ACCESS_KEY_ID="minio"
$env:AWS_SECRET_ACCESS_KEY="minio123"
$env:PYSPARK_SUBMIT_ARGS="--conf spark.driver.extraJavaOptions=--add-opens=java.base/javax.security.auth=ALL-UNNAMED pyspark-shell"
$env:JAVA_TOOL_OPTIONS="--enable-native-access=ALL-UNNAMED"
- Spark 3.5.5 (précompilé avec Hadoop 3)
$env:SPARK_HOME = "C:\spark"
$env:PYSPARK_SUBMIT_ARGS="--conf spark.driver.extraJavaOptions=--add-opens=java.base/javax.security.auth=ALL-UNNAMED pyspark-shell"
(Windows → zip à extraire dans C:\spark...)
$env:HADOOP_HOME = "C:\spark"
$env:hadoop_home_dir = "C:\spark"
Lancer MinIO dans Docker :
docker run -p 9000:9000 -p 9001:9001 \
-e MINIO_ACCESS_KEY=minio \
-e MINIO_SECRET_KEY=minio123 \
quay.io/minio/minio server /data --console-address ":9001"
Accès web : http://localhost:9001
Buckets à créer (automatiquement si besoin) :
- datasets
- models
- luigi-checkpoints
Pour que Spark puisse lire/écrire sur MinIO via S3A :
- hadoop-aws-3.3.4.jar
- aws-java-sdk-bundle-1.11.1026.jar
A placer dans le dossier C:\spark\jars\


