L'autoscaling de Managed Service pour Apache Spark vous permet d'effectuer un scaling dynamique des ressources de charge de travail, telles que le nombre d'exécuteurs, afin d'exécuter efficacement les jobs Spark. Activé par défaut, l'autoscaling utilise l'allocation dynamique des ressources Spark pour déterminer si, comment et quand effectuer le scaling de votre charge de travail.
Autoscaling Managed Service pour Apache Spark V2
La version 2 (V2) de l'autoscaling de Managed Service pour Apache Spark ajoute des fonctionnalités et des améliorations à la version 1 (V1) par défaut pour vous aider à gérer les charges de travail Managed Service pour Apache Spark, à améliorer les performances des charges de travail et à réduire les coûts :
- Scaling à la baisse asynchrone des nœuds : l'autoscaling V2 remplace le scaling à la baisse synchrone de la version V1 par un scaling à la baisse asynchrone. Grâce au scaling à la baisse asynchrone, Managed Service pour Apache Spark réduit les ressources de charge de travail sans attendre que tous les nœuds aient terminé la migration de brassage. Cela signifie que les nœuds de longue traîne qui effectuent un scaling à la baisse lentement ne bloquent pas le scaling à la hausse.
- Sélection intelligente des nœuds pour la réduction de la capacité : l'autoscaling V2 remplace la sélection aléatoire des nœuds de la V1 par un algorithme intelligent qui identifie les meilleurs nœuds pour réduire la capacité en premier. Cet algorithme prend en compte des facteurs tels que la taille des données de brassage du nœud et le temps d'inactivité.
- Comportement configurable de la mise hors service concertée et de la migration de brassage de Spark : l'autoscaling V2 vous permet d'utiliser les propriétés Spark standards pour configurer la mise hors service concertée et la migration de brassage de Spark. Cette fonctionnalité peut vous aider à maintenir la compatibilité de la migration avec vos propriétés Spark personnalisées.
Fonctionnalités d'autoscaling de Managed Service pour Apache Spark
| Fonctionnalité | Autoscaling Managed Service pour Apache Spark V1 | Autoscaling Managed Service pour Apache Spark V2 |
| Scaling à la baisse des nœuds | Synchrone | Asynchrone |
| Sélection de nœuds pour le scaling à la baisse | Aléatoire | Intelligent |
| Mise hors service progressive de Spark et migration de brassage | Non configurable | Configurable |
Propriétés d'allocation dynamique Spark
Le tableau suivant répertorie les propriétés d'allocation dynamique Spark que vous pouvez définir lorsque vous envoyez une charge de travail par lot pour contrôler l'autoscaling (voir comment définir les propriétés Spark).
| Propriété | Description | Par défaut |
|---|---|---|
spark.dataproc.scaling.version |
Version d'autoscaling de Managed Service pour Apache Spark. Spécifiez la version 1 ou 2. |
1 |
spark.dynamicAllocation.enabled |
Indique s'il faut utiliser l'allocation dynamique des ressources, qui augmente ou diminue le nombre d'exécuteurs en fonction de la charge de travail.
Définir la valeur sur false désactive l'autoscaling pour la charge de travail. Valeur par défaut : true. |
true |
spark.dynamicAllocation.initialExecutors |
Nombre initial d'exécuteurs alloués à la charge de travail. Une fois la charge de travail démarrée, l'autoscaling peut modifier le nombre d'exécuteurs actifs.
La valeur minimale est 2 et la valeur maximale est 2000. |
2 |
spark.dynamicAllocation.minExecutors |
Nombre minimal d'exécuteurs vers lequel réduire la charge de travail.
La valeur minimale est de 2. |
2 |
spark.dynamicAllocation.maxExecutors |
Nombre maximal d'exécuteurs jusqu'auquel faire évoluer la charge de travail.
La valeur maximale est de 2000. |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
Personnalise le scaling à la hausse de la charge de travail Spark. Accepte une valeur comprise entre 0 et 1. La valeur 1.0 offre une capacité de scaling à la hausse maximale et permet d'atteindre un parallélisme maximal. La valeur 0.5 définit la capacité de scaling à la hausse et le parallélisme sur la moitié de la valeur maximale. |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
Lorsque la valeur est true, les informations de diagnostic sont consignées si le nombre d'exécuteurs en cours d'exécution dépasse le nombre maximal d'exécuteurs nécessaires pour la période spécifiée par spark.dynamicAllocation.diagnosis.interval.
Le diagnostic inclut un résumé de l'exécuteur avec le nombre d'exécuteurs inactifs et les centiles de temps d'inactivité, la distribution des tâches actives, la taille des données de brassage et la taille des RDD mis en cache.
Utilisez spark.dynamicAllocation.diagnosis.logLevel pour contrôler le niveau de journalisation de la sortie. |
false |
spark.dynamicAllocation.profile |
Définissez la valeur sur performance ou cost pour appliquer un ensemble prédéfini de configurations optimisées pour les performances ou la rentabilité.
Les propriétés définies par l'utilisateur remplacent les valeurs par défaut du profil. Pour en savoir plus, consultez Profils d'allocation dynamique Spark. |
none |
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled |
Lorsque la valeur est true, active le calcul dynamique du délai avant expiration pour les exécuteurs contenant des données de brassage.
Au lieu d'utiliser la valeur statique spark.dynamicAllocation.shuffleTracking.timeout, le délai avant expiration est calculé en fonction de la quantité de données de brassage stockées sur l'exécuteur.
Cela permet de libérer plus rapidement les exécuteurs avec de petits brassages, tout en maintenant les exécuteurs avec de grands brassages actifs plus longtemps. |
false |
spark.reducer.fetchMigratedShuffle.enabled |
Lorsque cette option est définie sur true, elle permet de récupérer l'emplacement de sortie de la lecture aléatoire à partir du pilote Spark après l'échec d'une récupération à partir d'un exécuteur mis hors service en raison de l'allocation dynamique Spark. Cela réduit les erreurs ExecutorDeadException causées par la migration des blocs de brassage des exécuteurs mis hors service vers les exécuteurs actifs, et réduit les nouvelles tentatives d'étapes causées par les erreurs FetchFailedException (voir FetchFailedException causée par ExecutorDeadException).
Cette propriété est disponible dans les versions d'exécution Spark de Managed Service pour Apache Spark 1.1.12 et versions ultérieures, et 2.0.20 et versions ultérieures. |
false |
spark.scheduler.excludeShuffleSkewExecutors |
Lorsque la valeur est true, évite de planifier des tâches sur des exécuteurs asymétriques, qui sont des exécuteurs disposant d'une grande quantité de données de brassage ou d'un grand nombre de tâches de mappage terminées. Cela peut améliorer les performances en atténuant l'asymétrie de brassage. |
false |
Profils d'allocation dynamique Spark
Vous pouvez définir la propriété spark.dynamicAllocation.profile sur performance ou cost pour appliquer un ensemble prédéfini de configurations Spark optimisées pour les performances ou la rentabilité. Si vous définissez des propriétés Spark en plus de la propriété spark.dynamicAllocation.profile, vos paramètres remplaceront les valeurs par défaut du profil pour ces propriétés.
performance : ce profil optimise le temps d'exécution minimal en appliquant les paramètres par défaut suivants :
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost : ce profil optimise la réduction de la consommation de ressources en appliquant les paramètres par défaut suivants :
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
Métriques d'allocation dynamique Spark
Les charges de travail par lot Spark génèrent les métriques suivantes liées à l'allocation dynamique des ressources Spark (pour en savoir plus sur les métriques Spark, consultez Surveillance et instrumentation).
| Métrique | Description |
|---|---|
maximum-needed |
Nombre maximal d'exécuteurs nécessaires sous la charge actuelle pour satisfaire toutes les tâches en cours d'exécution et en attente. |
running |
Nombre d'exécuteurs en cours d'exécution qui exécutent des tâches. |
Problèmes et solutions liés à l'allocation dynamique Spark
FetchFailedException causée par ExecutorDeadException
Cause : Lorsque l'allocation dynamique Spark effectue un scaling à la baisse d'un exécuteur, le fichier de brassage est migré vers des exécuteurs actifs. Toutefois, étant donné que la tâche de réduction Spark sur un exécuteur récupère la sortie de brassage à partir de l'emplacement défini par le pilote Spark au démarrage de la tâche de réduction, si un fichier de brassage est migré, le réducteur peut continuer à tenter de récupérer la sortie de brassage à partir d'un exécuteur mis hors service, ce qui entraîne des erreurs
ExecutorDeadExceptionetFetchFailedException.Solution : Activez la récupération de l'emplacement de brassage en définissant
spark.reducer.fetchMigratedShuffle.enabledsurtruelorsque vous exécutez votre charge de travail par lot Managed Service pour Apache Spark (voir Définir les propriétés de la charge de travail par lot Spark). Lorsque cette propriété est activée, la tâche de réduction récupère à nouveau l'emplacement de sortie de la lecture aléatoire à partir du pilote après l'échec d'une récupération à partir d'un exécuteur mis hors service.