Scalabilità automatica orizzontale

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 esigenze. Dataflow esegue lo scale 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 streaming.

Scalabilità automatica batch

La scalabilità automatica orizzontale è abilitata per impostazione predefinita in tutte le pipeline batch. Dataflow sceglie automaticamente il numero di worker in base alla quantità totale stimata di lavoro in ogni fase della pipeline. Questa stima dipende dalle dimensioni dell'input e dalla velocità effettiva attuale. Ogni 30 secondi, Dataflow rivaluta la quantità di lavoro in base all'avanzamento dell'esecuzione. Man mano che la quantità totale stimata di lavoro aumenta o diminuisce, Dataflow scala dinamicamente il numero di worker verso l'alto o verso il basso.

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 diminuisce il numero di worker per risparmiare risorse inattive:

  • L'utilizzo medio della CPU del worker è inferiore al 5%.
  • Il parallelismo è limitato a causa di un lavoro non parallelizzabile, come dati non divisibili causati da file compressi o moduli I/O che non si dividono.
  • Il grado di parallelismo è fisso, ad esempio quando si scrive in file esistenti in Cloud Storage.

Per impostare un limite superiore al numero di worker, imposta l'opzione pipeline --maxNumWorkers. Il valore predefinito è 2,000. Per impostare un limite inferiore al numero di worker, imposta l'opzione di servizio --dataflow-service-options=min_num_workers. Questi flag sono facoltativi.

Scalabilità automatica dello streaming

Per i job di streaming, 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 abilitare la scalabilità automatica orizzontale per i job di streaming 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 al numero di worker, imposta l'opzione di servizio --dataflow-service-options=min_num_workers. Quando imposti questo valore, la scalabilità automatica orizzontale non viene ridotta al di sotto del numero di worker specificato. Questo flag è facoltativo.

Mentre un job di streaming è in esecuzione, puoi aggiornare il numero minimo e massimo di worker utilizzando un aggiornamento del job in volo. Per regolare le impostazioni, imposta i flag min-num-workers e max-num-workers. Per ulteriori informazioni, vedi Aggiornare l'intervallo di scalabilità automatica.

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.

Fonti personalizzate

Se crei un'origine dati personalizzata, puoi potenzialmente migliorare il rendimento implementando metodi che forniscono più informazioni all'algoritmo di scalabilità orizzontale automatica:

Java

Fonti delimitate

  • Nella sottoclasse BoundedSource, implementa il metodo getEstimatedSizeBytes. Il servizio Dataflow utilizza getEstimatedSizeBytes per calcolare il numero iniziale di worker da utilizzare per la pipeline.
  • Nella sottoclasse BoundedReader, implementa il metodo getFractionConsumed. Il servizio Dataflow utilizza getFractionConsumed per monitorare l'avanzamento della lettura e convergere sul numero corretto di worker da utilizzare durante una lettura.

Origini illimitate

L'origine deve informare il servizio Dataflow del backlog. Il backlog è una stima dell'input in byte che non è ancora stato elaborato dall'origine. Per comunicare al servizio il 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 in tutte le suddivisioni. In alcuni casi, il backlog non è disponibile per ogni suddivisione e può essere calcolato solo su 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

Fonti delimitate

  • Nella sottoclasse BoundedSource, implementa il metodo estimate_size. Il servizio Dataflow utilizza estimate_size per calcolare il numero iniziale di worker da utilizzare per la pipeline.
  • Nella sottoclasse RangeTracker, implementa il metodo fraction_consumed. Il servizio Dataflow utilizza fraction_consumed per monitorare l'avanzamento della lettura e convergere sul numero corretto di worker da utilizzare durante una lettura.

Vai

Fonti delimitate

  • Nel file RangeTracker, implementa il metodo GetProgress(). Il servizio Dataflow utilizza GetProgress per 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 ulteriori informazioni, 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 il numero di worker in modo efficace perché i worker potrebbero aver eseguito lo shuffle dei dati archiviati nei dischi locali.
  • La trasformazione PeriodicImpulse è supportata con lo scalabilità automatica dello streaming nelle versioni 2.60.0 e successive dell'SDK Apache Beam. Se la tua pipeline utilizza PeriodicImpulse con una versione precedente dell'SDK, i worker Dataflow non fare lo scale down come previsto.

Passaggi successivi