La scalabilità automatica orizzontale consente a Dataflow di scegliere il numero appropriato di istanze worker per il tuo job, aggiungendo o rimuovendo worker in base alle necessità. Dataflow scala in base all'utilizzo medio della CPU dei worker e al parallelismo di una pipeline. Il parallelismo di una pipeline è una stima del numero di thread necessari per elaborare i dati nel modo più efficiente in un determinato momento.
La scalabilità automatica orizzontale è supportata sia nelle pipeline batch che in quelle di streaming.
Scalabilità automatica di Batch
La scalabilità automatica orizzontale è abilitata per impostazione predefinita su tutte le pipeline batch. Dataflow sceglie automaticamente il numero di worker in base alla quantità totale di lavoro stimata in ogni fase della pipeline. Questa stima dipende dalle dimensioni dell'input e dal throughput attuale. Ogni 30 secondi, Dataflow rivaluta la quantità di lavoro in base all'avanzamento dell'esecuzione. Man mano che la quantità totale di lavoro stimata aumenta o diminuisce, Dataflow aumenta o riduce dinamicamente il numero di worker.
Il numero di worker è sublineare rispetto alla quantità di lavoro. Ad esempio, un job con il doppio del lavoro ha meno del doppio dei worker.
Se si verifica una delle seguenti condizioni, Dataflow mantiene o riduce il numero di worker per risparmiare risorse inattive:
- L'utilizzo medio della CPU dei worker è inferiore al 5%.
- Il parallelismo è limitato a causa di un lavoro non parallelizzabile, ad esempio dati non suddivisibili causati da file compressi o moduli di I/O che non si suddividono.
- Il grado di parallelismo è fisso, ad esempio quando si scrive su file esistenti in Cloud Storage.
Per impostare un limite superiore al numero di worker, imposta l'opzione della pipeline --maxNumWorkers.
Il valore predefinito è 2,000.
Per impostare un limite inferiore per il numero di worker, imposta l'opzione di servizio --dataflow-service-options=min_num_workers.
Questi flag sono facoltativi.
Scalabilità automatica per flussi di dati
Per i job di flussi di dati, la scalabilità automatica orizzontale consente a Dataflow di modificare in modo adattivo il numero di worker in risposta alle variazioni del carico e dell'utilizzo delle risorse.
La scalabilità automatica orizzontale è abilitata per impostazione predefinita per i job di streaming che utilizzano Streaming Engine. Per attivare la scalabilità automatica orizzontale per i job di flussi di dati che non utilizzano Streaming Engine, imposta le seguenti opzioni della pipeline quando avvii la pipeline:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
Sostituisci MAX_WORKERS con il numero massimo di istanze worker.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Sostituisci MAX_WORKERS con il numero massimo di istanze worker.
Vai
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Sostituisci MAX_WORKERS con il numero massimo di istanze worker.
Per impostare un limite inferiore per il numero di worker, imposta l'opzione di servizio --dataflow-service-options=min_num_workers. Quando imposti questo valore,
la scalabilità automatica orizzontale non scende al di sotto del numero di worker specificato. Questo
flag è facoltativo.
Per i job di flussi di dati che utilizzano Streaming Engine, puoi anche configurare una soglia di backlog impostando un livello di latenza.
Per un job di flussi di dati già in esecuzione, puoi aggiornare il numero minimo di worker, il numero massimo di worker o il livello di latenza utilizzando un aggiornamento del job in corso. Per regolare
le impostazioni, imposta i flag min-num-workers, max-num-workers o latency-tier. Per saperne di più, consulta Ottimizza la scalabilità automatica orizzontale per le pipeline di streaming.
Disabilita la scalabilità automatica orizzontale
Per disattivare la scalabilità automatica orizzontale, imposta la seguente opzione della pipeline quando esegui il job.
Java
--autoscalingAlgorithm=NONE
Se disattivi la scalabilità automatica orizzontale, Dataflow imposta il numero di worker in base all'opzione --numWorkers.
Python
--autoscaling_algorithm=NONE
Se disattivi la scalabilità automatica orizzontale, Dataflow imposta
il numero di worker in base all'opzione --num_workers.
Vai
--autoscaling_algorithm=NONE
Se disattivi la scalabilità automatica orizzontale, Dataflow imposta
il numero di worker in base all'opzione --num_workers.
Origini personalizzate
Se crei un'origine dati personalizzata, puoi potenzialmente migliorare le prestazioni implementando metodi che forniscono ulteriori informazioni all'algoritmo di scalabilità automatica orizzontale:
Java
Origini limitate
- Nella sottoclasse
BoundedSource, implementa il metodogetEstimatedSizeBytes. Il servizio Dataflow utilizzagetEstimatedSizeBytesper calcolare il numero iniziale di worker da utilizzare per la pipeline. - Nella sottoclasse
BoundedReader, implementa il metodogetFractionConsumed. Il servizio Dataflow utilizzagetFractionConsumedper monitorare l'avanzamento della lettura e convergere sul numero corretto di worker da utilizzare durante una lettura.
Origini non limitate
L'origine deve informare il servizio Dataflow del backlog.
Il backlog è una stima dell'input in byte che non è stato ancora elaborato dall'origine. Per informare il servizio del backlog, implementa uno dei seguenti metodi nella classe UnboundedReader.
getSplitBacklogBytes(): backlog per la suddivisione corrente dell'origine. Il servizio aggrega il backlog in tutte le suddivisioni.getTotalBacklogBytes(): il backlog globale di tutte le suddivisioni. In alcuni casi, il backlog non è disponibile per ogni suddivisione e può essere calcolato solo per tutte le suddivisioni. Solo la prima suddivisione (ID suddivisione "0") deve fornire il backlog totale.
Il repository Apache Beam contiene diversi esempi di origini personalizzate che implementano la classe UnboundedReader.
Python
Origini limitate
- Nella sottoclasse
BoundedSource, implementa il metodoestimate_size. Il servizio Dataflow utilizzaestimate_sizeper calcolare il numero iniziale di worker da utilizzare per la pipeline. - Nella sottoclasse
RangeTracker, implementa il metodofraction_consumed. Il servizio Dataflow utilizzafraction_consumedper monitorare l'avanzamento della lettura e convergere sul numero corretto di worker da utilizzare durante una lettura.
Vai
Origini limitate
- Nel tuo
RangeTracker, implementa il metodoGetProgress(). Il servizio Dataflow utilizzaGetProgressper monitorare l'avanzamento della lettura e convergere sul numero corretto di worker da utilizzare durante una lettura.
Limitazioni
- Nei job che eseguono Dataflow Prime, la scalabilità automatica orizzontale viene disattivata durante e fino a 10 minuti dopo la scalabilità automatica verticale. Per saperne di più, consulta Effetto sulla scalabilità automatica orizzontale.
- Per le pipeline che non utilizzano Dataflow Shuffle, Dataflow potrebbe non essere in grado di fare lo scale down dei worker in modo efficace perché i worker potrebbero avere dati sottoposti a shuffling archiviati su dischi locali.
- La trasformazione PeriodicImpulse è supportata con la scalabilità automatica in modalità flusso nelle versioni 2.60.0 e successive dell'SDK Apache Beam. Se la pipeline utilizza
PeriodicImpulsecon una versione precedente dell'SDK, i worker Dataflow non eseguono fare lo scale down come previsto.