Autoscaling Managed Service pour Apache Spark

Ce document fournit des informations sur l'autoscaling de Managed Service pour Apache Spark. Lorsque vous envoyez votre charge de travail Spark, Managed Service pour Apache Spark peut ajuster dynamiquement les ressources de la charge de travail, telles que le nombre d'exécuteurs, afin de l'exécuter efficacement. L'autoscaling de Managed Service pour Apache Spark est le comportement par défaut. Il utilise l'allocation dynamique des ressources Spark pour déterminer si, comment et quand ajuster votre charge de travail.

Autoscaling V2 de Managed Service pour Apache Spark

L'autoscaling version 2 (V2) 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 leurs performances et à réduire les coûts :

  • Réduction asynchrone des nœuds : l'autoscaling V2 remplace la réduction synchrone de la V1 par une réduction asynchrone. Grâce à la réduction asynchrone, Managed Service pour Apache Spark réduit les ressources de la charge de travail sans attendre que tous les nœuds aient terminé la migration du shuffle. Cela signifie que les nœuds à longue traîne qui se réduisent lentement n'empêchent pas l'augmentation.
  • Sélection intelligente des nœuds pour la réduction : 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 à réduire en premier. Cet algorithme prend en compte des facteurs tels que la taille des données de shuffle du nœud et le temps d'inactivité.
  • Mise hors service concertée et comportement de migration du shuffle Spark configurables: l'autoscaling V2 vous permet d'utiliser les propriétés Spark standards pour configurer la mise hors service concertée et la migration du shuffle 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 V1 de Managed Service pour Apache Spark Autoscaling V2 de Managed Service pour Apache Spark
Réduction des nœuds Synchrone Asynchrone
Sélection des nœuds pour la réduction Aléatoire Intelligent
Mise hors service concertée et migration du shuffle Spark 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 (découvrez 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 (consultez Autoscaling V2 de Managed Service pour Apache Spark). 1
spark.dynamicAllocation.enabled Indique si l'allocation dynamique des ressources doit être utilisée, ce qui augmente et diminue le nombre d'exécuteurs en fonction de la charge de travail. Si vous définissez la valeur sur false, l'autoscaling est désactivé 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 pour réduire la charge de travail. La valeur minimale est 2. 2
spark.dynamicAllocation.maxExecutors Nombre maximal d'exécuteurs pour augmenter la charge de travail. La valeur maximale est 2000. 1000
spark.dynamicAllocation.executorAllocationRatio Personnalise l'augmentation de la charge de travail Spark. Accepte une valeur comprise entre 0 et 1. La valeur 1.0 offre une capacité d'augmentation maximale et permet d'atteindre un parallélisme maximal. La valeur 0.5 définit la capacité d'augmentation et le parallélisme à la moitié de la valeur maximale. 0.3
spark.dynamicAllocation.diagnosis.enabled Lorsque la valeur est true, les informations de diagnostic sont enregistrées si les exécuteurs en cours dépassent 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 shuffle et la taille du 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, le calcul dynamique du délai d'inactivité est activé pour les exécuteurs contenant des données de shuffle. Au lieu d'utiliser le délai d'inactivité statique spark.dynamicAllocation.shuffleTracking.timeout, le délai d'inactivité est calculé en fonction de la quantité de données de shuffle stockées sur l'exécuteur. Cela permet de libérer plus rapidement les exécuteurs avec de petits shuffles tout en conservant plus longtemps les exécuteurs avec de grands shuffles. false
spark.reducer.fetchMigratedShuffle.enabled Lorsque la valeur est définie sur true, la récupération de l'emplacement de sortie du shuffle à partir du pilote Spark est activée 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 du bloc de shuffle des exécuteurs mis hors service vers les exécuteurs actifs, ainsi que les nouvelles tentatives d'étape causées par les erreurs FetchFailedException (consultez 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 ultérieures, ainsi que 2.0.20 et ultérieures. false
spark.scheduler.excludeShuffleSkewExecutors Lorsque la valeur est true, les tâches ne sont pas planifiées sur les exécuteurs à biais de shuffle, qui sont des exécuteurs contenant une grande quantité de données de shuffle ou un grand nombre de tâches de mappage terminées. Cela peut améliorer les performances en atténuant le biais de shuffle. 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 est optimisé pour un temps d'exécution minimal en appliquant les paramètres par défaut suivants :

  • spark.scheduler.excludeShuffleSkewExecutors: true
  • spark.dynamicAllocation.executorIdleTimeout : 300s
  • spark.dynamicAllocation.initialExecutors: 10

cost : ce profil est optimisé pour une consommation de ressources réduite en appliquant les paramètres par défaut suivants :

  • spark.dynamicAllocation.executorIdleTimeout: 120s
  • spark.dynamicAllocation.cachedExecutorIdleTimeout : 120s
  • spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled : true
  • spark.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 et en attente.
running Nombre d'exécuteurs en cours d'exécution.

Problèmes et solutions liés à l'allocation dynamique Spark

  • FetchFailedException causée par ExecutorDeadException

    Cause : lorsque l'allocation dynamique Spark réduit un exécuteur, le fichier de shuffle 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 du shuffle à partir de l'emplacement défini par le pilote Spark au démarrage de la tâche de réduction, si un fichier de shuffle est migré, le réducteur peut continuer à tenter de récupérer la sortie du shuffle à partir d'un exécuteur mis hors service, ce qui entraîne des erreurs ExecutorDeadException et FetchFailedException.

    Solution : activez la récupération de l'emplacement du shuffle en définissant spark.reducer.fetchMigratedShuffle.enabled sur true lorsque vous exécutez votre charge de travail par lot Managed Service pour Apache Spark (consultez 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 l'emplacement de sortie du shuffle à partir du pilote après l'échec d'une récupération à partir d'un exécuteur mis hors service.