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.