Ribilanciamento dinamico del lavoro

La funzionalità di ribilanciamento dinamico del lavoro del servizio Dataflow consente al servizio di ripartizionare dinamicamente il lavoro in base alle condizioni di runtime. Queste condizioni potrebbero includere quanto segue:

  • Squilibri nell'assegnazione del lavoro
  • I lavoratori impiegano più tempo del previsto per terminare
  • Operai che finiscono prima del previsto

Il servizio Dataflow rileva automaticamente queste condizioni e può assegnare dinamicamente il lavoro ai worker inutilizzati o sottoutilizzati per ridurre il tempo di elaborazione complessivo del job.

Limitazioni

Il ribilanciamento dinamico del lavoro si verifica solo quando il servizio Dataflow elabora alcuni dati di input in parallelo: quando legge i dati da un'origine di input esterna, quando lavora con un PCollection intermedio materializzato o quando lavora con il risultato di un'aggregazione come GroupByKey. Se un numero elevato di passaggi del job sono uniti, il job ha meno PCollection intermedi e il ribilanciamento dinamico del lavoro è limitato al numero di elementi nel PCollection materializzato di origine. Se vuoi assicurarti che il ribilanciamento dinamico del lavoro possa essere applicato a un particolare PCollection nella pipeline, puoi impedire la fusione in diversi modi per garantire il parallelismo dinamico.

Il ribilanciamento dinamico del lavoro non può parallelizzare i dati in modo più preciso di un singolo record. Se i tuoi dati contengono singoli record che causano ritardi significativi nell'elaborazione, potrebbero comunque ritardare il job. Dataflow non può suddividere e ridistribuire un singolo record "hot" a più worker.

Java

Se imposti un numero fisso di shard per l'output finale della pipeline (ad esempio scrivendo dati utilizzando TextIO.Write.withNumShards), Dataflow limita la parallelizzazione in base al numero di shard che scegli.

Python

Se imposti un numero fisso di shard per l'output finale della pipeline (ad esempio scrivendo dati utilizzando beam.io.WriteToText(..., num_shards=...)), Dataflow limita la parallelizzazione in base al numero di shard che scegli.

Go

Se imposti un numero fisso di shard per l'output finale della pipeline, Dataflow limita il parallelismo in base al numero di shard che scegli.

Utilizzo di origini dati personalizzate

Java

Se la pipeline utilizza un'origine dati personalizzata che fornisci, devi implementare il metodo splitAtFraction per consentire all'origine di funzionare con la funzionalità di ribilanciamento dinamico del lavoro.

Se implementi splitAtFraction in modo errato, i record della tua origine potrebbero sembrare duplicati o eliminati. Consulta le informazioni di riferimento sull'API RangeTracker per suggerimenti e assistenza sull'implementazione di splitAtFraction.

Python

Se la pipeline utilizza un'origine dati personalizzata fornita da te, il tuo RangeTracker deve implementare try_claim, try_split, position_at_fraction e fraction_consumed per consentire all'origine di funzionare con la funzionalità di ribilanciamento dinamico del lavoro.

Per saperne di più, consulta le informazioni di riferimento sull'API RangeTracker.

Go

Se la pipeline utilizza un'origine dati personalizzata che fornisci, devi implementare un RTracker valido per consentire all'origine di funzionare con la funzionalità di ribilanciamento dinamico del lavoro.

Per saperne di più, consulta le informazioni di riferimento dell'API RTracker.

Il ribilanciamento dinamico del lavoro utilizza il valore restituito del metodo getProgress() della tua origine personalizzata per l'attivazione. L'implementazione predefinita per getProgress() restituisce null. Per assicurarti che la scalabilità automatica si attivi, verifica che l'override dell'origine personalizzata getProgress() restituisca un valore appropriato.