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 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.