Je souhaite résoudre l'erreur « Error Code: 503 Slow Down » (Code d’erreur : 503 Ralentir) qui entraîne l'échec de mes tâches S3DistCP dans Amazon EMR.
Résolution
Lorsque vos données utilisent des partitions de type Apache Hive et que vous dépassez le taux de requêtes Amazon Simple Storage Service (Amazon S3), le message d'erreur suivant s'affiche :
« mapreduce.Job: Task Id : attempt_######_0012_r_000203_0, Status : FAILED Error: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3; Status Code: 503; Error Code: 503 Slow Down; Request ID: D27E827C847A8304; S3 Extended Request ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo=), S3 Extended Request ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo= at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712) »
Par exemple, les chemins Amazon S3 suivants utilisent le même préfixe, /year=2019/ :
- s3://awsexamplebucket/year=2019/month=11/day=01/mydata.parquet
- s3://awsexamplebucket/year=2019/month=11/day=02/mydata.parquet
- s3://awsexamplebucket/year=2019/month=11/day=03/mydata.parquet
Le quota de requêtes est de 3 500 requêtes d'écriture ou de 5 500 requêtes de lecture par seconde. Toutes les opérations comprises dans un préfixe sont prises en compte pour les quotas.
Si vous ne parvenez pas à augmenter le nombre de partitions, utilisez l'une des options suivantes pour résoudre les erreurs de limitation sur les tâches S3DistCp.
Diminuer le nombre de tâches de réduction
Le paramètre mapreduce.job.reduces définit le nombre de tâches de réduction pour la tâche. Amazon EMR définit automatiquement mapreduce.job.reduces en fonction du nombre de nœuds du cluster et des ressources mémoire du cluster.
Exécutez la commande suivante pour vérifier le nombre par défaut de tâches de réduction pour les tâches de votre cluster :
hdfs getconf -confKey mapreduce.job.reduces
Pour définir une nouvelle valeur pour mapreduce.job.reduce, exécutez la commande suivante :
s3-dist-cp -Dmapreduce.job.reduces=10 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
Remarque : Remplacez 10 par le nombre que vous souhaitez définir pour réduire les tâches. Remplacez également les exemples de valeurs par vos valeurs.
Augmenter le quota de nouvelles tentatives EMRFS
Par défaut, le quota de nouvelles tentatives EMRFS est défini sur 4.
Exécutez la commande suivante pour vérifier le quota de nouvelles tentatives pour votre cluster :
hdfs getconf -confKey fs.s3.maxRetries
Pour augmenter le quota de nouvelles tentatives pour une tâche s3-dist-cp, exécutez la commande suivante :
s3-dist-cp -Dfs.s3.maxRetries=20 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
Remarque : Remplacez 20 par le quota que vous souhaitez définir pour les nouvelles tentatives. Remplacez également les exemples de valeurs par vos valeurs.
Pour augmenter le quota de nouvelles tentatives sur un nouveau cluster, ajoutez un objet de configuration lorsque vous lancez un cluster. Pour augmenter le quota de nouvelles tentatives sur un cluster en cours d'exécution, utilisez l'objet de configuration pour remplacer la configuration du cluster pour le groupe d'instances.
Exemple d'objet de configuration pour les versions 5.21.0 et ultérieures d'Amazon EMR :
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
Lorsque vous augmentez le quota de nouvelles tentatives pour le cluster, les applications Apache Spark et Hive peuvent également utiliser le nouveau quota. L'exemple de session de shell Spark suivant utilise le quota de nouvelles tentatives le plus élevé :
spark> sc.hadoopConfiguration.set("fs.s3.maxRetries", "20")
spark> val source_df = spark.read.csv("s3://awsexamplebucket/data/")
spark> source_df.write.save("s3://awsexamplebucket2/output/")
Informations connexes
Bonnes pratiques relatives aux modèles de conception : optimisation des performances d'Amazon S3
Pour quelles raisons ma tâche Spark ou Hive sur Amazon EMR échoue-t-elle avec une exception AmazonS3Exception HTTP 503 « Service indisponible » ?