O Escalonamento automático horizontal permite que o Dataflow escolha o número apropriado de instâncias de worker para um job, adicionando ou removendo workers conforme necessário. O Dataflow é escalonado com base na utilização média da CPU dos workers e no paralelismo de um pipeline. O paralelismo de um pipeline é uma estimativa do número de linhas de execução necessárias para processar os dados com mais eficiência em um determinado momento.
O Escalonamento automático horizontal é compatível com pipelines de lote e streaming.
Escalonamento automático em lote
O Escalonamento automático horizontal é ativado por padrão em todos os pipelines em lote. O Dataflow escolhe automaticamente o número de workers com base na quantidade total estimada de trabalho em cada etapa do pipeline. Essa estimativa depende do tamanho da entrada e da capacidade atual. A cada 30 segundos, o Dataflow reavalia a quantidade de trabalho de acordo com o progresso da execução. À medida que a quantidade total estimada de trabalho aumenta ou diminui, o Dataflow ajusta dinamicamente o número de workers.
O número de workers é sublinear em relação à quantidade de trabalho. Por exemplo, um job com o dobro da carga de trabalho tem menos do que o dobro de workers.
Se alguma das condições a seguir ocorrer, o Dataflow mantém ou diminui o número de workers para economizar recursos inativos:
- O uso médio de CPU do worker é menor que 5%.
- O paralelismo é limitado devido a um trabalho sem paralelo, como dados não divididos causados por arquivos compactados ou módulos de E/S que não se dividem.
- O grau de paralelismo é fixo, por exemplo, ao gravar em arquivos existentes no Cloud Storage.
Para definir um limite superior para o número de workers, defina a opção de pipeline --maxNumWorkers
.
O valor padrão é 2,000
.
Para definir um limite inferior para o número de workers, defina a
opção de serviço --min_num_workers
.
Essas sinalizações são opcionais.
Escalonamento automático de streaming
Para jobs de streaming, o Escalonamento automático horizontal permite que o Dataflow altere adaptativamente o número de workers em resposta a mudanças na carga e na utilização de recursos.
O Escalonamento automático horizontal é ativado por padrão para jobs de streaming que usam o Streaming Engine. Para ativar o Escalonamento automático horizontal para jobs de streaming que não usam o Streaming Engine, defina as seguintes opções de pipeline ao iniciar o pipeline:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
Substitua MAX_WORKERS pelo número máximo de instância de worker.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Substitua MAX_WORKERS pelo número máximo de instância de worker.
Go
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Substitua MAX_WORKERS pelo número máximo de instância de worker.
Para definir um limite inferior para o número de workers, defina a
opção de serviço --min_num_workers
.
Quando você define esse valor, o escalonamento automático horizontal não é menor que o número
de workers especificado. Essa sinalização é opcional.
Desativar o Escalonamento automático horizontal
Para desativar o Escalonamento automático horizontal, defina a opção de pipeline a seguir ao executar o job.
Java
--autoscalingAlgorithm=NONE
Se você desativar o Escalonamento automático horizontal, o Dataflow vai definir
o número de workers com base na opção --numWorkers
.
Python
--autoscaling_algorithm=NONE
Se você desativar o Escalonamento automático horizontal, o Dataflow vai definir
o número de workers com base na opção --num_workers
.
Go
--autoscaling_algorithm=NONE
Se você desativar o Escalonamento automático horizontal, o Dataflow vai definir
o número de workers com base na opção --num_workers
.
Origens personalizadas
Se você criar uma origem de dados personalizada, poderá melhorar o desempenho implementando métodos que forneçam mais informações ao algoritmo de Escalonamento automático horizontal:
Java
Origens limitadas
- Na subclasse
BoundedSource
, implemente o métodogetEstimatedSizeBytes
. O serviço do Dataflow usagetEstimatedSizeBytes
ao calcular o número inicial de workers que serão usados no pipeline. - Na subclasse
BoundedReader
, implemente o métodogetFractionConsumed
. O serviço do Dataflow usagetFractionConsumed
para acompanhar o progresso de leitura e convergir para o número correto de workers que serão usados durante uma leitura.
Origens ilimitadas
A fonte precisa informar o serviço do Dataflow sobre o backlog.
O backlog é uma estimativa da entrada
em bytes que ainda não foi processada pela fonte. Para informar o
serviço sobre o backlog, implemente um dos métodos a seguir na
classe UnboundedReader
.
getSplitBacklogBytes()
: backlog para a divisão atual da fonte. O serviço agrega o backlog em todas as divisões.getTotalBacklogBytes()
: backlog global em todas as divisões. Em alguns casos, o backlog não está disponível para cada divisão e só pode ser calculado em todas elas. Somente a primeira divisão (com ID "0") precisa fornecer o backlog total.
O repositório do Apache Beam tem
vários exemplos
de fontes personalizadas que implementam a classe UnboundedReader
.
Python
Origens limitadas
- Na subclasse
BoundedSource
, implemente o métodoestimate_size
. O serviço do Dataflow usaestimate_size
ao calcular o número inicial de workers que serão usados no pipeline. - Na subclasse
RangeTracker
, implemente o métodofraction_consumed
. O serviço do Dataflow usafraction_consumed
para acompanhar o progresso de leitura e convergir para o número correto de workers que serão usados durante uma leitura.
Go
Origens limitadas
- No
RangeTracker
, implemente o métodoGetProgress()
. O serviço do Dataflow usaGetProgress
para acompanhar o progresso de leitura e convergir para o número correto de workers que serão usados durante uma leitura.
Limitações
- Nos jobs que executam o Dataflow Prime, o Escalonamento automático horizontal é desativado durante e até 10 minutos após o Escalonamento automático vertical. Para mais informações, consulte Efeito no escalonamento automático horizontal.
- No caso dos pipelines que não usam o Dataflow Shuffle, talvez o Dataflow não consiga reduzir o escalonamento dos workers efetivamente porque os dados armazenados em discos locais podem ter sido embaralhados aleatoriamente pelos workers.
- A transformação PeriodicImpulse não é compatível com o escalonamento automático de streaming. Se o pipeline usar
PeriodicImpulse
, os workers do Dataflow não serão reduzidos conforme esperado.
A seguir
- Ajustar o escalonamento automático horizontal para pipelines de streaming
- Monitorar o escalonamento automático do Dataflow
- Resolver problemas de escalonamento automático do Dataflow