Ma tâche Apache Spark ou Apache Hive sur Amazon EMR échoue avec une exception HTTP 503 « Slow Down » AmazonS3Exception similaire à l’exception suivante : java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3 ; code d'état : 503 ; Code d’erreur : 503 Slow Down; Request ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=
Brève description
Cette erreur se produit lorsque le taux de requêtes Amazon Simple Storage Service (Amazon S3) pour votre application dépasse les taux généralement soutenus de plus de 5 000 requêtes par seconde, et qu'Amazon S3 optimise les performances en interne.
Pour améliorer le taux de réussite de vos requêtes lors de l'accès aux données S3 à l'aide d'Amazon EMR, essayez les approches suivantes :
- Modifiez la stratégie de nouvelle tentative pour les requêtes S3.
- Ajustez le nombre de requêtes S3 simultanées.
Résolution
Pour faciliter l’identification du 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 S3. Vous pouvez déterminer la solution la mieux adaptée à votre cas d'utilisation sur la base de ces métriques CloudWatch.
Configurer les métriques de requête CloudWatch
Pour surveiller les requêtes Amazon S3, activez les métriques de requête CloudWatch pour le compartiment. Puis, définissez un filtre pour le préfixe. Pour obtenir une liste des mesures utiles à surveiller, consultez la section Surveillance des métriques avec Amazon CloudWatch.
Modifier la stratégie de nouvelle tentative pour les requêtes S3
Par défaut, EMRFS utilise une stratégie de backoff exponentiel pour réessayer les requêtes adressées à Amazon S3. La limite de 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. Si vous définissez une valeur très élevée pour ce paramètre, la durée des tâches peut être plus longue. Essayez de définir ce paramètre sur une valeur élevée (par exemple, 20), surveillez la durée des tâches, puis ajustez ce 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 le cluster lancé, les applications Spark et Hive exécutées 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 :
1. Ouvrez la console Amazon EMR.
2. Dans la liste de clusters, choisissez le cluster actif que vous souhaitez reconfigurer sous Nom.
3. Ouvrez la page de détails du cluster et choisissez l'onglet Configurations.
4. Dans la liste déroulante Filtre, sélectionnez le groupe d'instances que vous souhaitez reconfigurer.
5. Dans la liste déroulante Reconfigurer, sélectionnez Modifier dans la table.
6. Dans le tableau de classification des configurations, sélectionnez Ajouter une configuration, puis saisissez les informations suivantes :
Pour Classification : emrfs-site
Pour Propriété : fs.s3.maxRetries
Pour Valeur : la nouvelle valeur pour la limite de nouvelles tentatives (par exemple, 20)
7. Sélectionnez Appliquer cette configuration à tous les groupes d'instances actifs.
8. Sélectionnez Enregistrer les modifications.
Une fois la configuration déployée, les applications Spark et Hive utilisent la nouvelle limite.
Pour augmenter la limite de nouvelles tentatives au moment de l'exécution, utilisez une session shell Spark similaire à la session suivante :
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/")
Voici un exemple de la procédure d'augmentation de la limite de nouvelles tentatives au moment de l'exécution pour une application Hive :
hive> set fs.s3.maxRetries=20;
hive> select ....
Ajuster le nombre de requêtes S3 simultanées
- Si plusieurs tâches (Spark, Apache Hive ou s-dist-cp) lisent et écrivent avec le même préfixe S3, vous pouvez ajuster la simultanéité. Commencez par les tâches les plus intensives en lecture/écriture et réduisez leur simultanéité pour éviter un parallélisme excessif. Si vous avez configuré l'accès intercompte pour Amazon S3, n'oubliez pas que 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. Vous pouvez regrouper des objets de plus petite taille avec des objets plus grands afin de réduire le nombre d'objets à lire par la tâche. Cela vous permet de lire des jeux de données avec moins de requêtes de lecture. 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 » ?