Orchestration de Spark sur AWS EMR avec Apache Airflow — L’approche Low-Ops
Exécuter Apache Spark à grande échelle est un problème déjà résolu — mais la manière dont vous l’exécutez peut avoir un impact majeur sur les coûts, la stabilité et la charge opérationnelle.
Si votre plateforme de données utilise déjà Apache Airflow pour l’orchestration, vous pourriez être tenté de lancer Spark directement sur des pods Kubernetes. Cela fonctionne — mais cela implique aussi de gérer les images runtime Spark, les services de shuffle, le tuning JVM et l’isolation des ressources dans Kubernetes.
Il existe une voie plus simple : laisser Airflow jouer le rôle de chef d’orchestre, et confier à AWS EMR le gros du travail Spark.
Dans cet article, nous verrons pourquoi cette approche fonctionne si bien et nous passerons en revue une configuration minimale d’Airflow 2.x pour lancer des jobs Spark sur EMR — sans aucune complexité Kubernetes.
Pourquoi EMR + Airflow fonctionne
Avec EMR, vous obtenez un runtime Spark managé qui sait déjà communiquer avec S3, s’intégrer au Glue Data Catalog et évoluer à la hausse ou à la baisse à la demande.
Le rôle d’Airflow se limite à l’orchestration : planification, dépendances, relances et suivi des états de jobs.
Avantages clés :
- Pas de babysitting de cluster : EMR gère le tuning du runtime, les mises à jour Hadoop/Spark et l’auto-scaling des nœuds.
- Intégration AWS native : S3, Glue, KMS et logs CloudWatch prêts à l’emploi.
- Modèle de coût élastique : EMR Serverless pour ne payer que le temps d’exécution, ou clusters EMR transitoires pour les workloads lourds ponctuels.
- Environnement stable : pas de différences entre Spark local en dev et Spark dans des images pod Kubernetes.
Choisir le bon mode EMR
Deux approches principales existent pour associer Airflow à EMR :
Mode | Quand l’utiliser | Avantages |
---|---|---|
EMR Serverless | La plupart des jobs ETL batch sur S3 | Aucun cluster à gérer, facturation à la seconde |
Cluster EMR transitoire | Jobs nécessitant des types d’instances spécifiques ou un usage intensif d’HDFS | Contrôle complet de Spark, cluster à la demande |
Nous allons nous concentrer sur EMR Serverless pour sa simplicité, mais le mode cluster transitoire est tout aussi simple à ajouter ensuite.
DAG Airflow minimal pour EMR Serverless
Voici le chemin le plus court entre Airflow et Spark sur EMR Serverless.
from datetime import datetime
from airflow import DAG
from airflow.providers.amazon.aws.operators.emr import EmrServerlessStartJobOperator
from airflow.providers.amazon.aws.sensors.emr import EmrServerlessJobSensor
APPLICATION_ID = "VOTRE-APP-ID" # Application Spark EMR Serverless
S3_SCRIPT = "s3://mon-bucket/code/job.py"
S3_LOGS = "s3://mon-bucket/logs/"
with DAG(
dag_id="spark_sur_emr_serverless",
start_date=datetime(2025, 1, 1),
schedule=None,
catchup=False,
) as dag:
start_job = EmrServerlessStartJobOperator(
task_id="start_spark",
application_id=APPLICATION_ID,
execution_role_arn="arn:aws:iam::123456789012:role/EmrJobRole",
job_driver={
"sparkSubmit": {
"entryPoint": S3_SCRIPT,
"sparkSubmitParameters": (
"--conf spark.executor.instances=4 "
"--conf spark.executor.memory=4g "
"--conf spark.executor.cores=2 "
)
}
},
configuration_overrides={
"monitoringConfiguration": {
"s3MonitoringConfiguration": {"logUri": S3_LOGS}
}
},
aws_conn_id="aws_default",
wait_for_completion=False,
)
wait_job = EmrServerlessJobSensor(
task_id="wait_spark",
application_id=APPLICATION_ID,
job_id=start_job.output,
aws_conn_id="aws_default",
poke_interval=30,
timeout=3600,
)
start_job >> wait_job
Ce qui se passe :
EmrServerlessStartJobOperator
: soumet votre script PySpark à EMR Serverless avec les paramètres d’exécution.EmrServerlessJobSensor
: attend la fin du job pour déclencher les étapes suivantes.- Aucun YAML de cluster, aucune maintenance d’image JVM — vous ne gérez que votre code Spark.
Exemple de job Spark
Un simple script PySpark (job.py
) stocké dans S3 :
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("ExempleJob").getOrCreate()
data = [("Alice", 34), ("Bob", 45), ("Cathy", 29)]
df = spark.createDataFrame(data, ["nom", "âge"])
df.filter(df.âge > 30).show()
spark.stop()
Comparaison avec Spark sur Kubernetes
Critère | EMR depuis Airflow | Spark sur Kubernetes |
---|---|---|
Temps de setup | Minutes | Heures–jours |
Maintenance | AWS gère le runtime | Vous gérez le runtime |
Scalabilité | Automatique | Autoscalers à configurer |
Intégration AWS | Native | Nécessite configuration IAM |
Portabilité | AWS uniquement | Tout cluster Kubernetes |
Conclusion
Si votre priorité est de livrer des pipelines de données plutôt que de gérer de l’infrastructure, exécuter Spark via EMR depuis Airflow est un choix évident. Vous pourrez toujours migrer vers Kubernetes plus tard si le multi-cloud ou des runtimes personnalisés deviennent prioritaires — mais EMR vous amènera en production plus vite, avec moins de pièces à assembler.
Astuce : Commencez avec EMR Serverless pour des gains rapides. Si les performances ou le coût deviennent critiques, envisagez les clusters EMR transitoires avec des groupes d’instances optimisés.
Table of Contents
- Pourquoi EMR + Airflow fonctionne
- Choisir le bon mode EMR
- DAG Airflow minimal pour EMR Serverless
- Exemple de job Spark
- Comparaison avec Spark sur Kubernetes
- Conclusion
Trending
Table of Contents
- Pourquoi EMR + Airflow fonctionne
- Choisir le bon mode EMR
- DAG Airflow minimal pour EMR Serverless
- Exemple de job Spark
- Comparaison avec Spark sur Kubernetes
- Conclusion