Com o recurso Reequilíbrio dinâmico de trabalho do serviço Dataflow, o serviço reparticiona dinamicamente o trabalho baseado nas condições do ambiente de execução. Essas condições podem incluir:
- Desequilíbrio nas atribuições de trabalho
- Workers levam mais tempo do que o estimado para finalizar
- Conclusão dos workers antes do tempo estimado
O serviço Dataflow detecta automaticamente essas condições e atribui dinamicamente o trabalho a workers não utilizados ou subutilizados para diminuir o tempo de processamento geral do job.
Limitações
O rebalanceamento de trabalho dinâmico acontece apenas quando o serviço Dataflow está
processando dados de entrada em paralelo: ao ler dados de uma fonte de entrada
externa, trabalhar com uma PCollection
intermediária materializada ou
trabalhar com o resultado de uma operação de agregação como GroupByKey
. Se houver fusão de um grande número de etapas do job, ele terá menos PCollection
s intermediários, e o rebalanceamento dinâmico do trabalho será limitado aos número de elementos na origem materializada PCollection
. Para que o
rebalanceamento de trabalho dinâmico seja aplicado a uma determinada
PCollection
no pipeline, há algumas maneiras diferentes de evitar a fusão para
garantir o carregamento em paralelo dinâmico.
O reequilíbrio dinâmico de trabalho não pode atuar em dados mais refinados do que um registro único. Se os dados contêm registros individuais que causam grandes atrasos no tempo de processamento, eles ainda podem atrasar o job. O Dataflow não pode subdividir e redistribuir um registro individual "ativo" para vários workers.
Java
Se você definir um número fixo de fragmentos para a saída final do pipeline (por exemplo, gravação de dados usando TextIO.Write.withNumShards
), o Dataflow limitará o carregamento em paralelo ao número de fragmentos escolhido.
Python
Se você definir um número fixo de fragmentos para a saída final do pipeline (por exemplo, gravação de dados usando beam.io.WriteToText(..., num_shards=...)
), o Dataflow limitará o carregamento em paralelo ao número de fragmentos escolhido. do Google Analytics.
Go
Se você definir um número fixo de fragmentos para a saída final do pipeline, o Dataflow limitará o carregamento em paralelo ao número de fragmentos escolhido.
Como trabalhar com origens de dados personalizadas
Java
Se o pipeline usar uma fonte de dados personalizada fornecida por você,
implemente o método splitAtFraction
para que ela funcione com o
recurso de rebalanceamento de trabalho dinâmico.
Se splitAtFraction
for implementado incorretamente, os registros da fonte podem
aparecer duplicados ou descartados. Confira as
informações de referência da API sobre o RangeTracker se precisar de ajuda e dicas para
implementar splitAtFraction
.
Python
Se o pipeline usar uma fonte de dados personalizada fornecida por você, seu
RangeTracker
precisa implementar try_claim
, try_split
,
position_at_fraction
e fraction_consumed
para que ela funcione
com o recurso de rebalanceamento de trabalho dinâmico.
Saiba mais em informações de referência da API sobre o RangeTracker.
Go
Se o pipeline usar uma fonte de dados personalizada fornecida por você,
implemente um RTracker
válido para que ela funcione com o recurso de
rebalanceamento de trabalho dinâmico.
Saiba mais nas informações de referência da API RTracker.
O rebalanceamento do trabalho dinâmico usa o valor de retorno do método getProgress()
da sua origem personalizada para ser ativado. A implementação padrão para getProgress()
retorna null
. Para garantir que o escalonamento automático seja ativado, faça com que a fonte personalizada substitua getProgress()
para retornar um valor apropriado.