Comment résoudre l'erreur « Error Code : 503 Slow Down » sur les tâches S3DistCp dans Amazon EMR ?

Date de la dernière mise à jour : 10/02/2020

Ma tâche S3DistCp (s3-dist-cp) sur Amazon EMR échoue en raison de la limitation d'Amazon Simple Storage Service (Amazon S3). J'obtiens un message d'erreur similaire à ce qui suit :

mapreduce.Job: Task Id : attempt_xxxxxx_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)

Brève description

L'erreur « Slow Down » (Ralentir) se produit lorsque vous dépassez le taux de requêtes Amazon S3 (3 500 requêtes PUT/COPY/POST/DELETE et 5 500 requêtes GET/HEAD par seconde et par préfixe dans un compartiment). Cela se produit souvent lorsque vos données utilisent des partitions de type Apache Hive. Par exemple, les chemins Amazon S3 suivants utilisent le même préfixe (/year=2019/). Cela signifie que la limite de demandes est de 3 500 demandes d'écriture ou 5 500 demandes de lecture par seconde.

  • 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

Si vous ne pouvez pas augmenter le nombre de partitions, réduisez le nombre de tâches de réducteur ou augmentez la limite de relance du EMR File System (EMRFS) pour résoudre les erreurs de limitation Amazon S3.

Solution

Utilisez l'une des options suivantes pour résoudre les erreurs de limitation sur les tâches s3-dist-cp.

Réduire le nombre de tâches de réducteur

Le paramètre mapreduce.job.reduces définit le nombre de tâches de réducteur pour la tâche. Amazon EMR définit automatiquement mapreduce.job.reduces en fonction du nombre de nœuds dans le cluster et des ressources de mémoire du cluster. Exécutez la commande suivante pour confirmer le nombre par défaut de tâches de réducteur pour les tâches de votre cluster :

$ hdfs getconf -confKey mapreduce.job.reduces

Pour définir une nouvelle valeur pour mapreduce.job.reduces, exécutez une commande similaire à ce qui suit. Cette commande définit le nombre de tâches de réducteur sur 10.

$ s3-dist-cp -Dmapreduce.job.reduces=10 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/

Augmenter la limite de relance EMRFS

Par défaut, la limite de relance EMRFS est définie sur 4. Exécutez la commande suivante pour confirmer la limite de relance pour votre cluster :

$ hdfs getconf -confKey fs.s3.maxRetries

Pour augmenter la limite de relance pour une seule tâche s3-dist-cp, exécutez une commande similaire à ce qui suit. Cette commande définit la limite de relance sur 20.

$ s3-dist-cp -Dfs.s3.maxRetries=20 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/

Pour augmenter la limite de relance sur un nouveau cluster ou un cluster en cours d'exécution :

[
    {
      "Classification": "emrfs-site",
      "Properties": {
        "fs.s3.maxRetries": "20"
      }
    }
]

Lorsque vous augmentez la limite de relance pour le cluster, les applications Spark et Hive peuvent également utiliser la nouvelle limite. Voici un exemple de session shell Spark qui utilise la limite de relance la plus élevée :

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/")