Scalabilità automatica orizzontale

La scalabilità automatica orizzontale consente a Dataflow di scegliere il numero appropriato di istanze worker per il job, aggiungendo o rimuovendo worker in base alle esigenze. Dataflow scala in base all'utilizzo medio della CPU da parte dei worker e al parallelismo di una pipeline. Il parallelismo di una pipeline è una stima del numero di thread necessari per elaborare i dati in modo più efficiente in un determinato momento.

La scalabilità automatica orizzontale è supportata nelle pipeline in modalità batch e flusso.

Scalabilità automatica batch

La scalabilità automatica orizzontale è abilitata per impostazione predefinita su tutte le pipeline in modalità 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 di 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 fa lo scale up o lo scale down del numero di worker in modo dinamico.

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 gestisce 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 impareggiabile, come i dati non separabili causati da file compressi o moduli di I/O che non si dividono.
  • Il grado di parallelismo è fisso, ad esempio durante la scrittura su file esistenti in Cloud Storage.

Per impostare un limite superiore sul numero di worker, imposta l'opzione pipeline --maxNumWorkers. Questo flag è facoltativo per i job batch. Il valore predefinito è 1000.

Scalabilità automatica dei flussi di dati

Per i job di elaborazione in modalità flusso, la scalabilità automatica orizzontale consente a Dataflow di modificare in modo adattabile il numero di worker in risposta ai cambiamenti nel carico e nell'utilizzo delle risorse.

La scalabilità automatica orizzontale è abilitata per impostazione predefinita per i job di elaborazione in modalità flusso che utilizzano Streaming Engine. Per abilitare la scalabilità automatica orizzontale per i job di flusso che non utilizzano Streaming Engine, imposta le seguenti opzioni della pipeline all'avvio della 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.

Go

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

Sostituisci MAX_WORKERS con il numero massimo di istanze worker.

Disattiva scalabilità automatica orizzontale

Per disabilitare la scalabilità automatica orizzontale, imposta la seguente opzione pipeline quando esegui il job.

Java

--autoscalingAlgorithm=NONE

Se disabiliti la scalabilità automatica orizzontale, Dataflow imposta il numero di worker in base all'opzione --numWorkers.

Python

--autoscaling_algorithm=NONE

Se disabiliti la scalabilità automatica orizzontale, Dataflow imposta il numero di worker in base all'opzione --num_workers.

Go

--autoscaling_algorithm=NONE

Se disabiliti 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 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 non ancora elaborati 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 divisioni. In alcuni casi, il backlog non è disponibile per ogni suddivisione e può essere calcolato solo per tutte le suddivisioni. Solo la prima suddivisione (ID diviso "0") deve fornire un 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 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.

Go

Origini limitate

  • In 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 la sezione Effetti sulla scalabilità automatica orizzontale.
  • Per le pipeline che non utilizzano Dataflow shuffling, Dataflow potrebbe non essere in grado di fare lo scale down in modo efficace dei worker perché potrebbero aver eseguito lo shuffling dei dati archiviati su dischi locali.
  • La trasformazione PeriodicImpulse non è supportata con la scalabilità automatica dei flussi di dati. Se la pipeline utilizza PeriodicImpulse, lo fare lo scale down dei worker di Dataflow non avviene come previsto.

Passaggi successivi