Ma tâche Apache Spark ou Apache Hive sur Amazon EMR échoue avec une exception HTTP 503 « Slow Down » AmazonS3Exception.
Brève description
Lorsque le taux de requête Amazon Simple Storage Service (Amazon S3) pour votre application dépasse les taux généralement soutenus et qu’Amazon S3 optimise en interne les performances, l’erreur suivante s’affiche :
« java.io.IOException: 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: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE= »
Résolution
Configurer les métriques de requête CloudWatch
Pour identifier le problème lié à un trop grand nombre de requêtes, il est recommandé de configurer les métriques de requête Amazon CloudWatch pour le compartiment Amazon S3.
Activez les métriques de requête CloudWatch pour le compartiment et définissez un filtre pour le préfixe.
Modifier la stratégie de nouvelle tentative pour les requêtes Amazon S3
Par défaut, le système de fichiers EMR (EMRFS) utilise une stratégie de backoff exponentiel pour réessayer les requêtes adressées à Amazon S3. La limite de nouvelles tentatives EMRFS par défaut est de 15. Toutefois, vous pouvez augmenter la limite de nouvelles tentatives sur un nouveau cluster, sur un cluster en cours d'exécution ou lors de l'exécution de l'application.
Pour augmenter la limite de nouvelles tentatives, modifiez la valeur du paramètre fs.s3.maxRetries.
Remarque : Si vous définissez une valeur très élevée pour ce paramètre, la durée des tâches peut être plus longue.
Définissez le paramètre sur une valeur élevée, par exemple, 20 et surveillez le surcoût lié à la durée des tâches. Puis, ajustez le paramètre en fonction de votre cas d’utilisation.
Pour un nouveau cluster, vous pouvez ajouter un objet de configuration similaire à l’objet suivant lorsque vous lancez le cluster :
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
Une fois que vous avez lancé le cluster, les applications Spark et Hive qui s’exécutent sur Amazon EMR utilisent la nouvelle limite.
Pour augmenter la limite de nouvelles tentatives sur un cluster en cours d'exécution, procédez comme suit :
- Ouvrez la console Amazon EMR.
- Choisissez le cluster actif que vous souhaitez reconfigurer.
- Sélectionnez l'onglet Configurations.
- Dans la liste déroulante Filtre, sélectionnez le groupe d'instances que vous souhaitez reconfigurer.
- Dans la liste déroulante Reconfigurer, sélectionnez Modifier dans la table.
- Dans le tableau de classification des configurations, sélectionnez Ajouter une configuration, puis utilisez les valeurs suivantes :
Pour Classification, utilisez emrfs-site
Pour Propriété, utilisez fs.s3.maxRetries
Pour Valeur, utilisez la nouvelle valeur pour la limite de nouvelles tentatives. Par exemple, 20.
- Sélectionnez Appliquer cette configuration à tous les groupes d'instances actifs.
- Sélectionnez Enregistrer les modifications.
Une fois que vous avez déployé la configuration, les applications Spark et Hive utilisent la nouvelle limite.
Pour augmenter la limite de nouvelles tentatives à l’exécution d’un application Spark, utilisez une session Shell Spark pour modifier le paramètre fs.s3.maxRetries similaire à l’exemple suivant :
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/")
Pour augmenter la limite de nouvelles tentatives à l’exécution d’une application Hive, exécutez une commande similaire à l’exemple suivant :
hive> set fs.s3.maxRetries=20;
hive> select ....
Ajuster le nombre de requêtes Amazon S3 simultanées
- Si vous disposez de plusieurs tâches (Spark, Apache Hive ou s-dist-cp) qui lisent et écrivent avec le même préfixe Amazon S3, vous pouvez ajuster la simultanéité. Commencez par les tâches les plus intensives en lecture ou écriture et réduisez leur simultanéité pour éviter un parallélisme excessif.
Remarque : Si vous avez configuré l'accès intercompte pour Amazon S3, d'autres comptes peuvent également soumettre des tâches au même préfixe.
- Si des erreurs apparaissent lorsque la tâche tente d'écrire dans le compartiment de destination, réduisez le parallélisme d'écriture excessif. Par exemple, utilisez les opérations .coalesce() ou .repartition() Spark pour réduire le nombre de partitions de sortie Spark avant d'écrire sur Amazon S3. Vous pouvez également réduire le nombre de cœurs par exécuteur ou réduire le nombre d'exécuteurs.
- Si des erreurs s'affichent lorsque la tâche tente de lire à partir du compartiment source, ajustez la taille des objets. Pour réduire le nombre d’objets lus par la tâche, regroupez les objets de plus petite taille en objets plus grands. Par exemple, utilisez s3-dist-cp pour fusionner un grand nombre de fichiers de petite taille en un plus petit nombre de grands fichiers.
Informations connexes
Bonnes pratiques relatives aux modèles de conception : optimisation des performances d'Amazon S3
Pour quelles raisons mon application Amazon EMR échoue-t-elle avec une exception AmazonS3Exception HTTP 403 « Access Denied » ?
Pour quelles raisons mon application Amazon EMR échoue-t-elle avec une exception AmazonS3Exception HTTP 404 « Not Found » ?