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 un 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 estimé de travail augmente ou diminue, Dataflow effectue un scaling à la hausse ou à la baisse du nombre de nœuds de calcul de manière dynamique.
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 sur le nombre de nœuds de calcul, définissez l'option de pipeline --maxNumWorkers
.
La valeur par défaut est 2,000
.
Pour définir une limite inférieure sur le nombre de nœuds de calcul, définissez l'option de service --min_num_workers
.
Ces options sont facultatives.
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.
Pour définir une limite inférieure sur le nombre de nœuds de calcul, définissez l'option de service --min_num_workers
.
Lorsque vous définissez cette valeur, l'autoscaling horizontal n'évolue pas en dessous du nombre de nœuds de calcul spécifié. Cette option est facultative.
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éthodegetEstimatedSizeBytes
. Le service Dataflow utilisegetEstimatedSizeBytes
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éthodegetFractionConsumed
. Le service Dataflow utilisegetFractionConsumed
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 des tâches 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éthodeestimate_size
. Le service Dataflow utiliseestimate_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éthodefraction_consumed
. Le service Dataflow utilisefraction_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éthodeGetProgress()
. Le service Dataflow utiliseGetProgress
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'effectuent pas automatiquement de scaling à la baisse comme prévu.
Étapes suivantes
- Ajuster l'autoscaling horizontal pour les pipelines de traitement par flux
- Surveiller l'autoscaling de Dataflow
- Résoudre les problèmes liés à l'autoscaling de Dataflow