Escalonamento automático horizontal

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. Essa sinalização é opcional para jobs em lote. O valor padrão é 1000.

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.

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étodo getEstimatedSizeBytes. O serviço do Dataflow usa getEstimatedSizeBytes ao calcular o número inicial de workers que serão usados no pipeline.
  • Na subclasse BoundedReader, implemente o método getFractionConsumed. O serviço do Dataflow usa getFractionConsumed 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étodo estimate_size. O serviço do Dataflow usa estimate_size ao calcular o número inicial de workers que serão usados no pipeline.
  • Na subclasse RangeTracker, implemente o método fraction_consumed. O serviço do Dataflow usa fraction_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étodo GetProgress(). O serviço do Dataflow usa GetProgress 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