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 nei compiti di lavoro
- Lavoratori che impiegano più tempo del previsto per terminare
- Lavoratori che terminano più velocemente 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
La ribilanciamento dinamico del lavoro si verifica solo quando il servizio Dataflow elabora alcuni dati di input in parallelo: durante la lettura dei dati da un'origine di input esterna, quando si lavora con un elemento intermedio materializzato PCollection
o quando si lavora con il risultato di un'aggregazione come GroupByKey
. Se un numero elevato di passaggi nel job è fuso, quest'ultimo ha meno PCollection
intermedi e il ribilanciamento dinamico del lavoro è limitato al numero di elementi nell'origine materializzato PCollection
. Se
vuoi assicurarti che il ribilanciamento dinamico del lavoro possa essere applicato a un particolare
PCollection
nella tua pipeline, puoi
prevenire la fusione in diversi modi
per assicurare il parallelismo dinamico.
La ribilanciamento dinamico del lavoro non può ribilanciare i dati in modo più preciso rispetto a un singolo record. Se i tuoi dati contengono singoli record che causano ritardi significativi nel tempo di elaborazione, potrebbero comunque ritardare il job. Dataflow non può suddividere e ridistribuire un singolo record "hot" tra 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 il 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 il 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 parallelizzazione in base al numero di shard che scegli.
Utilizzare le origini dati personalizzate
Java
Se la tua pipeline utilizza un'origine dati personalizzata da te fornita, devi implementare il metodo splitAtFraction
per consentire all'origine di utilizzare la funzionalità di ribilanciamento dinamico del lavoro.
Se implementi splitAtFraction
in modo errato, i record della tua origine potrebbero essere duplicati o eliminati. Consulta le informazioni di riferimento sulle API su RangeTracker per assistenza e suggerimenti sull'implementazione di splitAtFraction
.
Python
Se la tua pipeline utilizza un'origine dati personalizzata da te fornita, RangeTracker
deve implementare try_claim
, try_split
, position_at_fraction
e fraction_consumed
per consentire all'origine di utilizzare la funzionalità di ribilanciamento dinamico del lavoro.
Per ulteriori informazioni, consulta le informazioni di riferimento delle API su RangeTracker.
Go
Se la tua pipeline utilizza un'origine dati personalizzata da te fornita, devi implementare un valore RTracker
valido per consentire all'origine di utilizzare la funzionalità di ribilanciamento dinamico del lavoro.
Per saperne di più, consulta le informazioni di riferimento sull'API RTracker.
La ribilanciamento dinamico del lavoro utilizza il valore restituito del metodo getProgress()
dell'origine personalizzata per l'attivazione. L'implementazione predefinita per getProgress()
restituisce
null
. Per assicurarti che la scalabilità automatica venga attivata, verifica che l'origine personalizzata esegua l'override di getProgress()
per restituire un valore appropriato.