En bref
Les API AWS EMR (Elastic MapReduce) permettent de gérer des clusters big data exécutant Hadoop, Spark, Hive et Presto. Automatisez la création de clusters, la soumission de tâches par étapes, l’auto-échelonnement selon la charge, et la terminaison automatique en fin de traitement. L’authentification s’appuie sur AWS IAM. Pour fiabiliser vos tests, utilisez Apidog afin de valider les configurations de cluster, tester les soumissions de tâches via l’API, et documenter vos pipelines de données.
Essayez Apidog dès aujourd'hui
Introduction
AWS EMR est le service Hadoop/Spark géré sur AWS. Il traite des pétaoctets de données pour l’analyse, le machine learning, et les pipelines ETL. Plutôt que de gérer vous-même un cluster Hadoop, déléguez l’infrastructure à AWS.
EMR s’exécute sur des instances EC2 dans un cluster. À spécifier lors du déploiement :
- Types d’instances (maître, cœur, tâche)
- Applications à installer (Spark, Hadoop, Hive, Presto, HBase)
- Actions d’amorçage (scripts de configuration)
- Étapes (tâches à exécuter)
L’API EMR permet d’automatiser l’ensemble du cycle. Créez, surveillez, intégrez EMR à vos workflows et à d’autres services AWS.
💡 Astuce : Pour la construction de pipelines de données, validez vos configurations de cluster et vos définitions de tâches avec Apidog avant d’exécuter des traitements coûteux.
À l’issue de ce guide, vous saurez :
- Créer/configurer des clusters EMR via l’API
- Soumettre des tâches par étapes
- Gérer l’auto-échelonnement
- Surveiller l’état du cluster et des tâches
- Optimiser les coûts avec les flottes d’instances et instances spot
Authentification avec AWS
EMR utilise l’authentification AWS standard via IAM.
Approche AWS SDK (recommandée)
import { EMRClient, RunJobFlowCommand } from '@aws-sdk/client-emr'
const client = new EMRClient({
region: 'us-east-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
})
API directe avec SigV4
La signature AWS SigV4 est requise. Utilisez les SDK, boto3, AWS CLI ou signez manuellement.
aws emr list-clusters --region us-east-1
Autorisations IAM
Politique minimale pour EMR :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticmapreduce:*",
"ec2:Describe*",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": "*"
}
]
}
Création d’un cluster
Création de cluster de base
aws emr create-cluster \
--name "My Spark Cluster" \
--release-label emr-7.0.0 \
--applications Name=Spark Name=Hadoop \
--instance-type m5.xlarge \
--instance-count 3 \
--service-role EMR_DefaultRole \
--job-flow-role EMR_EC2_DefaultRole
Via l’API (RunJobFlow)
{
"Name": "Data Processing Cluster",
"ReleaseLabel": "emr-7.0.0",
"Applications": [
{ "Name": "Spark" },
{ "Name": "Hadoop" },
{ "Name": "Hive" }
],
"Instances": {
"MasterInstanceType": "m5.xlarge",
"SlaveInstanceType": "m5.xlarge",
"InstanceCount": 3,
"KeepJobFlowAliveWhenNoSteps": true,
"TerminationProtected": false
},
"Steps": [],
"ServiceRole": "EMR_DefaultRole",
"JobFlowRole": "EMR_EC2_DefaultRole",
"LogUri": "s3://my-bucket/emr-logs/",
"Tags": [
{ "Key": "Environment", "Value": "Production" }
]
}
Réponse :
{
"JobFlowId": "j-ABC123DEF456"
}
Groupes d’instances vs flottes d’instances
Groupes d’instances : type fixe par groupe (maître/cœur/tâche).
Flottes d’instances : plusieurs types/options par groupe, EMR choisit selon le prix/disponibilité.
{
"Instances": {
"InstanceFleets": [
{
"Name": "MasterFleet",
"InstanceFleetType": "MASTER",
"TargetOnDemandCapacity": 1,
"InstanceTypeConfigs": [
{ "InstanceType": "m5.xlarge" },
{ "InstanceType": "m4.xlarge" }
]
},
{
"Name": "CoreFleet",
"InstanceFleetType": "CORE",
"TargetOnDemandCapacity": 2,
"TargetSpotCapacity": 4,
"InstanceTypeConfigs": [
{ "InstanceType": "m5.2xlarge" },
{ "InstanceType": "m4.2xlarge" }
],
"LaunchSpecifications": {
"SpotSpecification": {
"TimeoutDurationMinutes": 60,
"TimeoutAction": "SWITCH_TO_ON_DEMAND"
}
}
}
]
}
}
Soumission de tâches par étapes
EMR exécute les tâches sous forme d’« étapes » séquencées.
Ajouter une étape Spark
aws emr add-steps \
--cluster-id j-ABC123DEF456 \
--steps '[
{
"Name": "Process Data",
"ActionOnFailure": "CONTINUE",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"spark-submit",
"--deploy-mode",
"cluster",
"--class",
"com.example.DataProcessor",
"s3://my-bucket/jars/processor.jar",
"s3://my-bucket/input/",
"s3://my-bucket/output/"
]
}
}
]'
Via l’API (AddJobFlowSteps)
{
"JobFlowId": "j-ABC123DEF456",
"Steps": [
{
"Name": "Spark ETL Job",
"ActionOnFailure": "CONTINUE",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"spark-submit",
"--executor-memory",
"4g",
"--executor-cores",
"2",
"s3://my-bucket/scripts/process.py",
"--input",
"s3://my-bucket/input/",
"--output",
"s3://my-bucket/output/"
]
}
}
]
}
Options ActionOnFailure
-
TERMINATE_CLUSTER: Arrête le cluster si échec -
CANCEL_AND_WAIT: Annule les étapes restantes, cluster maintenu -
CONTINUE: Continue avec l’étape suivante
Étape Hive
{
"Name": "Hive Query",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"hive-script",
"--run-hive-script",
"--args",
"-f",
"s3://my-bucket/scripts/transform.q"
]
}
}
Mise à l’échelle automatique
EMR peut ajouter/retirer des nœuds selon la charge.
Créer une politique de mise à l’échelle automatique
aws emr put-auto-scaling-policy \
--cluster-id j-ABC123DEF456 \
--instance-group-id ig-ABC123 \
--auto-scaling-policy '{
"Constraints": {
"MinCapacity": 2,
"MaxCapacity": 10
},
"Rules": [
{
"Name": "ScaleOut",
"Description": "Add nodes when memory is high",
"Action": {
"SimpleScalingPolicyConfiguration": {
"AdjustmentType": "CHANGE_IN_CAPACITY",
"ScalingAdjustment": 2,
"CoolDown": 300
}
},
"Trigger": {
"CloudWatchAlarmDefinition": {
"ComparisonOperator": "GREATER_THAN",
"EvaluationPeriods": 3,
"MetricName": "MemoryAvailableMB",
"Namespace": "AWS/ElasticMapReduce",
"Period": 300,
"Threshold": 2000,
"Statistic": "AVERAGE"
}
}
}
]
}'
Métriques pour la mise à l’échelle
-
MemoryAvailableMB: mémoire libre -
MemoryTotalMB: mémoire totale -
HDFSUtilization: espace HDFS utilisé -
AppsRunning: jobs YARN actifs -
AppsPending: jobs YARN en attente
Surveillance et journalisation
Lister les clusters
aws emr list-clusters --states RUNNING
Décrire un cluster
aws emr describe-cluster --cluster-id j-ABC123DEF456
Réponse :
{
"Cluster": {
"Id": "j-ABC123DEF456",
"Name": "My Cluster",
"Status": {
"State": "RUNNING",
"StateChangeReason": {},
"Timeline": {
"CreationDateTime": "2026-03-24T10:00:00.000Z"
}
},
"Applications": [
{ "Name": "Spark", "Version": "3.5.0" }
],
"InstanceCollectionType": "INSTANCE_GROUP",
"LogUri": "s3://my-bucket/emr-logs/",
"MasterPublicDnsName": "ec2-12-34-56-78.compute-1.amazonaws.com"
}
}
Lister les étapes
aws emr list-steps --cluster-id j-ABC123DEF456
Statut de l’étape
{
"Id": "s-ABC123",
"Name": "Process Data",
"Status": {
"State": "COMPLETED",
"Timeline": {
"StartDateTime": "2026-03-24T10:05:00.000Z",
"EndDateTime": "2026-03-24T11:30:00.000Z"
}
}
}
Intégration CloudWatch
EMR publie des métriques vers CloudWatch :
JobsFailedJobsRunningMemoryAvailableMBMemoryTotalMBHDFSUtilization
Optimisation des coûts
Utiliser les instances spot
Les nœuds de tâche conviennent aux instances spot. Si un nœud est arrêté, le traitement continue sur les autres.
{
"Name": "TaskGroup",
"InstanceRole": "TASK",
"InstanceType": "m5.2xlarge",
"InstanceCount": 4,
"Market": "SPOT",
"BidPrice": "0.10"
}
Clusters transitoires
Créez un cluster, exécutez les tâches, puis terminez-le automatiquement :
{
"KeepJobFlowAliveWhenNoSteps": false,
"Steps": [
{ ... step 1 ... },
{ ... step 2 ... }
]
}
Le cluster se termine une fois toutes les étapes accomplies.
Flottes d’instances avec plusieurs options
Laissez EMR choisir le type d’instance le moins cher disponible :
{
"InstanceTypeConfigs": [
{
"InstanceType": "m5.2xlarge",
"BidPrice": "0.15"
},
{
"InstanceType": "m4.2xlarge",
"BidPrice": "0.12"
},
{
"InstanceType": "c5.2xlarge",
"BidPrice": "0.10"
}
]
}
Test avec Apidog
Les clusters EMR impliquent des coûts : testez vos configurations en amont.
1. Valider les configurations de cluster
Enregistrez vos modèles de cluster dans Apidog :
pm.test('Cluster has required applications', () => {
const config = pm.request.body.toJSON()
const apps = config.Applications.map(a => a.Name)
pm.expect(apps).to.include('Spark')
})
pm.test('Instance types are valid', () => {
const config = pm.request.body.toJSON()
const types = ['m5.xlarge', 'm5.2xlarge', 'm4.xlarge']
pm.expect(types).to.include(config.Instances.MasterInstanceType)
})
2. Tester les définitions d’étapes
pm.test('Spark step has valid args', () => {
const step = pm.request.body.toJSON().Steps[0]
const args = step.HadoopJarStep.Args
pm.expect(args[0]).to.eql('spark-submit')
pm.expect(args).to.include('--deploy-mode')
})
3. Variables d’environnement
AWS_REGION: us-east-1
EMR_SERVICE_ROLE: EMR_DefaultRole
EMR_EC2_ROLE: EMR_EC2_DefaultRole
S3_LOG_BUCKET: my-emr-logs
S3_SCRIPTS_BUCKET: my-emr-scripts
Erreurs courantes et correctifs
ValidationError : ServiceRole n’est pas valide
Cause : Rôle IAM inexistant ou mal configuré pour EMR.
Correctif : Créez un rôle de service via IAM ou utilisez le rôle par défaut AWS : EMR_DefaultRole_V2.
Échec du provisionnement des instances EC2
Cause : Type d’instance indisponible ou limite atteinte.
Correctifs :
- Utilisez des flottes d’instances avec plusieurs types
- Demandez une augmentation de limite AWS
- Essayez d’autres types d’instances
Échec d’étape avec code de sortie d’application 1
Cause : La tâche Spark/Hadoop a échoué.
Correctif : Consultez les logs S3 (LogUri). Vérifiez stderr et stdout de l’étape.
Cluster bloqué à l’état DÉMARRAGE
Cause : Action d’amorçage échouée ou problème IAM/S3.
Correctif : Vérifiez la console EC2 et les accès S3 pour les scripts d’amorçage.
Alternatives et comparaisons
| Fonctionnalité | AWS EMR | Google Dataproc | Azure HDInsight | Databricks |
|---|---|---|---|---|
| Hadoop/Spark géré | ✓ | ✓ | ✓ | Spark uniquement |
| Intégration AWS | Excellent | Limité | Limité | Bon |
| Option sans serveur | EMR Serverless | Dataproc Serverless | Limité | ✓ |
| Coût | Support Spot | VMs préemptibles | Instances Spot | Bon |
| Support ML | EMR Studio | Vertex AI | Synapse | MLflow intégré |
EMR offre la meilleure intégration AWS. Databricks propose de meilleurs outils Spark. Dataproc est plus économique sur GCP.
Cas d’utilisation concrets
ETL de lac de données : traitement quotidien de ventes. EMR ingère les CSV depuis S3, transforme via Spark, stocke en Parquet. Clusters actifs 2h/j puis terminés.
Analyse de logs : traitement de logs SaaS. Spark lit les logs S3, agrège, alimente un data warehouse. L’auto-échelonnement gère les pics.
Machine learning : entraînement de modèles sur EMR. Spark lit les features S3, entraîne MLlib, exporte vers SageMaker.
En résumé
Ce que vous avez appris :
- Créer des clusters via l’API RunJobFlow
- Soumettre des tâches par étapes
- Utiliser l’auto-échelonnement pour optimiser les coûts
- Surveiller avec CloudWatch
- Réduire les coûts via instances spot et clusters transitoires
Prochaines étapes :
- Configurez vos rôles IAM pour EMR
- Créez un cluster de test
- Soumettez une tâche Spark simple
- Vérifiez les logs sur S3
- Implémentez des stratégies d’économie de coûts
FAQ
Quelle est la différence entre les nœuds maître, cœur et tâche ?
- Maître : gère le cluster (YARN ResourceManager, HDFS NameNode)
- Cœur : traite et stocke les données HDFS
- Tâche : traite uniquement, pas de stockage HDFS (idéal spot)
Comment se connecter en SSH au nœud maître ?
aws emr ssh --cluster-id j-ABC123DEF456 --key-pair-file my-key.pem
Puis-je exécuter des notebooks Jupyter sur EMR ?
Oui : utilisez EMR Studio, activez JupyterHub, ou les EMR Notebooks.
Qu’est-ce qu’EMR Serverless ?
Exécution Spark/Hive sans gestion de cluster. Paiement à la tâche. Idéal pour charges ponctuelles.
Comment lire à partir de DynamoDB ?
Utilisez le connecteur DynamoDB :
spark-submit --conf spark.hadoop.dynamodb.servicename=dynamodb \
--conf spark.hadoop.dynamodb.input.tableName=MyTable \
--conf spark.hadoop.dynamodb.output.tableName=MyTable \
--conf spark.hadoop.dynamodb.region=us-east-1 \
my-job.jar
Quel label de version utiliser ?
La dernière version stable (emr-7.x pour Spark 3.x). Vérifiez la compatibilité dans les notes de version.
Comment dépanner les étapes échouées ?
- Vérifiez le statut d’étape :
aws emr describe-step - Consultez les logs S3 :
s3://your-log-bucket/logs/j-ABC123/steps/s-DEF123/ - Connectez-vous en SSH au nœud maître, consultez
/mnt/var/log/

Top comments (0)