Passer au contenu

Comment puis-je résoudre l’erreur « Error Code: 503 Slow Down » (Code d’erreur : 503 Ralentir) sur les tâches S3DistCp dans Amazon EMR ?

Lecture de 3 minute(s)
0

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 » ?

AWS OFFICIELA mis à jour il y a un an