A funcionalidade de reequilíbrio dinâmico do trabalho do serviço Dataflow permite que o serviço reparticione dinamicamente o trabalho com base nas condições de tempo de execução. Estas condições podem incluir o seguinte:
- Desequilíbrios nas atribuições de trabalho
- Os trabalhadores estão a demorar mais do que o esperado a terminar
- Os trabalhadores terminam mais rapidamente do que o esperado
O serviço Dataflow deteta automaticamente estas condições e pode atribuir dinamicamente trabalho a trabalhadores não utilizados ou subutilizados para diminuir o tempo de processamento geral da sua tarefa.
Limitações
O reequilíbrio dinâmico do trabalho só ocorre quando o serviço Dataflow está a processar alguns dados de entrada em paralelo: quando lê dados de uma origem de entrada externa, quando trabalha com um PCollection intermédio materializado ou quando trabalha com o resultado de uma agregação como GroupByKey. Se um grande número de passos no seu trabalho estiver fundido, o seu trabalho tem menos PCollections intermédios e o reequilíbrio dinâmico do trabalho está limitado ao número de elementos no PCollection materializado de origem. Se quiser garantir que o reequilíbrio dinâmico do trabalho pode ser aplicado a um determinado
PCollection no seu pipeline, pode
impedir a união de algumas
formas diferentes para garantir o paralelismo dinâmico.
O reequilíbrio dinâmico do trabalho não pode paralelizar novamente os dados com mais detalhe do que um único registo. Se os seus dados contiverem registos individuais que causem grandes atrasos no tempo de processamento, podem continuar a atrasar a sua tarefa. O Dataflow não pode subdividir e redistribuir um registo "frequente" individual para vários trabalhadores.
Java
Se definir um número fixo de fragmentos para o resultado final do seu pipeline (por exemplo, escrevendo dados através de TextIO.Write.withNumShards), o Dataflow limita a paralelização com base no número de fragmentos que escolher.
Python
Se definir um número fixo de fragmentos para o resultado final do seu pipeline (por exemplo, escrevendo dados através de beam.io.WriteToText(..., num_shards=...)), o Dataflow limita a paralelização com base no número de fragmentos que escolher.
Go
Se definir um número fixo de fragmentos para o resultado final do seu pipeline, o Dataflow limita a paralelização com base no número de fragmentos que escolher.
Trabalhar com origens de dados personalizadas
Java
Se o seu pipeline usar uma origem de dados personalizada que fornece, tem de
implementar o método splitAtFraction para permitir que a sua origem funcione com a
funcionalidade de reequilíbrio dinâmico do trabalho.
Se implementar splitAtFraction incorretamente, os registos da sua origem podem parecer duplicados ou eliminados. Consulte as informações de referência da API sobre o RangeTracker para obter ajuda e sugestões sobre a implementação de splitAtFraction.
Python
Se o seu pipeline usar uma origem de dados personalizada que fornece, o seu
RangeTracker tem de implementar try_claim, try_split,
position_at_fraction e fraction_consumed para permitir que a sua origem funcione
com a funcionalidade de reequilíbrio dinâmico do trabalho.
Consulte as informações de referência da API sobre o RangeTracker para mais informações.
Go
Se o seu pipeline usar uma origem de dados personalizada que fornece, tem de implementar um RTracker válido para permitir que a sua origem funcione com a funcionalidade de reequilíbrio dinâmico do trabalho.
Para mais informações, consulte as informações de referência da API RTracker.
O reequilíbrio dinâmico do trabalho usa o valor de retorno do método getProgress()
da sua origem personalizada para ativar. A implementação predefinida de getProgress() devolve
null. Para garantir que o dimensionamento automático é ativado, certifique-se de que a sua origem personalizada substitui getProgress() para devolver um valor adequado.