Autoscaling horizontal

L'autoscaling horizontal permet à Dataflow de choisir le nombre approprié d'instances de nœuds de calcul pour votre job, en ajoutant ou en supprimant des nœuds de calcul selon les besoins. Dataflow effectue le scaling en fonction de l'utilisation moyenne du processeur des nœuds de calcul et du parallélisme d'un pipeline. Le parallélisme d'un pipeline est une estimation du nombre de threads nécessaires pour traiter les données le plus efficacement possible à tout moment.

L'autoscaling horizontal est compatible avec les pipelines de traitement par lot et par flux.

Autoscaling par lots

L'autoscaling horizontal est activé par défaut sur tous les pipelines de traitement par lot. Dataflow choisit automatiquement le nombre de nœuds de calcul en fonction de l'estimation du volume total de travail pour chaque étape de votre pipeline. Cette estimation dépend de la taille d'entrée et du débit actuel. Toutes les 30 secondes, Dataflow réévalue la quantité de travail en fonction de la progression de l'exécution. À mesure que le volume total de travail estimé augmente ou diminue, Dataflow adapte de manière dynamique le nombre de nœuds de calcul.

Le nombre de nœuds de calcul est une fonction sous-linéaire de la quantité de travail. Par exemple, un job comportant le double de travail se verra affecter moins de deux fois le nombre de nœuds de calcul.

Si l'une des conditions suivantes survient, Dataflow conserve ou réduit le nombre de nœuds de calcul afin d'économiser les ressources inactives :

  • L'utilisation moyenne du processeur du nœud de calcul est inférieure à 5 %.
  • Le parallélisme est limité en raison d'un travail impossible à charger en parallèle, comme par exemple des données non partitionnables causées par des fichiers compressés ou des modules d'E/S non divisibles.
  • Le degré de parallélisme est fixe, par exemple lors de l'écriture dans des fichiers existants dans Cloud Storage.

Pour définir une limite supérieure du nombre de nœuds de calcul, définissez l'option de pipeline --maxNumWorkers. Cette option est facultative pour les jobs par lot. La valeur par défaut est 1000.

Autoscaling de flux

Pour les jobs de traitement par flux, l'autoscaling horizontal permet à Dataflow de modifier de manière adaptative le nombre de nœuds de calcul en réponse aux changements d'utilisation des ressources et de charge.

L'autoscaling horizontal est activé par défaut pour les jobs de traitement par flux qui utilisent Streaming Engine. Afin d'activer l'autoscaling horizontal pour les jobs de traitement par flux qui n'utilisent pas Streaming Engine, définissez les options de pipeline suivantes lorsque vous démarrez votre pipeline :

Java

--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS

Remplacez MAX_WORKERS par le nombre maximal d'instances de nœud de calcul.

Python

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

Remplacez MAX_WORKERS par le nombre maximal d'instances de nœud de calcul.

Go

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

Remplacez MAX_WORKERS par le nombre maximal d'instances de nœud de calcul.

Désactiver l'autoscaling horizontal

Pour désactiver l'autoscaling horizontal, définissez l'option de pipeline suivante lorsque vous exécutez le job.

Java

--autoscalingAlgorithm=NONE

Si vous désactivez l'autoscaling horizontal, Dataflow définit le nombre de nœuds de calcul en fonction de l'option --numWorkers.

Python

--autoscaling_algorithm=NONE

Si vous désactivez l'autoscaling horizontal, Dataflow définit le nombre de nœuds de calcul en fonction de l'option --num_workers.

Go

--autoscaling_algorithm=NONE

Si vous désactivez l'autoscaling horizontal, Dataflow définit le nombre de nœuds de calcul en fonction de l'option --num_workers.

Sources personnalisées

Si vous créez une source de données personnalisée, vous pouvez potentiellement améliorer les performances en mettant en œuvre des méthodes qui fournissent plus d'informations à l'algorithme d'autoscaling horizontal :

Java

Sources limitées

  • Dans votre sous-classe BoundedSource, mettez en œuvre la méthode getEstimatedSizeBytes. Le service Dataflow utilise getEstimatedSizeBytes lors du calcul du nombre initial de nœuds de calcul à utiliser pour votre pipeline.
  • Dans votre sous-classe BoundedReader, mettez en œuvre la méthode getFractionConsumed. Le service Dataflow utilise getFractionConsumed pour suivre la progression de la lecture et converger vers le nombre correct de nœuds de calcul à utiliser lors d'une lecture.

Sources illimitées

La source doit informer le service Dataflow du traitement en attente. Le traitement en attente est une estimation de l'entrée en octets qui n'a pas encore été traitée par la source. Pour informer le service du traitement en attente, mettez en œuvre l'une des deux méthodes suivantes dans votre classe UnboundedReader.

  • getSplitBacklogBytes() : traitement en attente pour la répartition actuelle de la source. Le service regroupe les traitements en attente dans toutes les répartitions.
  • getTotalBacklogBytes() : traitement en attente global sur toutes les répartitions. Dans certains cas, le traitement en attente n'est pas disponible pour chaque répartition et ne peut être calculé que sur l'ensemble des répartitions. Seule la première répartition (ID de répartition "0") doit fournir le traitement en attente total.

Le dépôt Apache Beam contient plusieurs exemples de sources personnalisées qui mettent en œuvre la classe UnboundedReader.

Python

Sources limitées

  • Dans votre sous-classe BoundedSource, mettez en œuvre la méthode estimate_size. Le service Dataflow utilise estimate_size lors du calcul du nombre initial de nœuds de calcul à utiliser pour votre pipeline.
  • Dans votre sous-classe RangeTracker, mettez en œuvre la méthode fraction_consumed. Le service Dataflow utilise fraction_consumed pour suivre la progression de la lecture et converger vers le nombre correct de nœuds de calcul à utiliser lors d'une lecture.

Go

Sources limitées

  • Dans votre RangeTracker, mettez en œuvre la méthode GetProgress(). Le service Dataflow utilise GetProgress pour suivre la progression de la lecture et converger vers le nombre correct de nœuds de calcul à utiliser lors d'une lecture.

Limites

  • Dans les jobs qui exécutent Dataflow Prime, l'autoscaling horizontal est désactivé pendant et jusqu'à 10 minutes après l'autoscaling vertical. Pour en savoir plus, consultez la page Effet sur l'autoscaling horizontal.
  • Pour les pipelines qui n'utilisent pas Dataflow Shuffle, Dataflow est susceptible de ne pas pouvoir effectuer un scaling efficace des nœuds de calcul car ceux-ci peuvent avoir brassé les données stockées sur des disques locaux.
  • La transformation PeriodicImpulse n'est pas compatible avec l'autoscaling de flux. Si votre pipeline utilise PeriodicImpulse, les nœuds de calcul Dataflow n'évoluent pas à la baisse comme prévu.

Étapes suivantes