O escalamento automático horizontal permite que o Dataflow escolha o número adequado de instâncias de worker para a sua tarefa, adicionando ou removendo workers conforme necessário. O Dataflow é dimensionado com base na utilização média da CPU dos trabalhadores e no paralelismo de um pipeline. O paralelismo de um pipeline é uma estimativa do número de threads necessários para processar os dados de forma mais eficiente em qualquer momento.
O dimensionamento automático horizontal é suportado em pipelines de streaming e em lote.
Escala automática em lote
O dimensionamento automático horizontal está ativado por predefinição em todos os pipelines de processamento em lote. O Dataflow escolhe automaticamente o número de trabalhadores com base na quantidade total estimada de trabalho em cada fase da sua pipeline. Esta estimativa depende do tamanho da entrada e do débito 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 dimensiona dinamicamente o número de trabalhadores para cima ou para baixo.
O número de trabalhadores é sublinear em relação à quantidade de trabalho. Por exemplo, um trabalho com o dobro do trabalho tem menos do dobro dos trabalhadores.
Se ocorrer alguma das seguintes condições, o Dataflow mantém ou diminui o número de trabalhadores para poupar recursos inativos:
- A utilização média da CPU do trabalhador é inferior a 5%.
- O paralelismo é limitado devido a trabalho não paralelizado, como dados não divisíveis causados por ficheiros comprimidos ou módulos de E/S que não se dividem.
- O grau de paralelismo é fixo, por exemplo, quando escreve em ficheiros existentes no Cloud Storage.
Para definir um limite superior para o número de trabalhadores, defina a opção de pipeline --maxNumWorkers
.
O valor predefinido é 2,000
.
Para definir um limite inferior para o número de trabalhadores, defina a --dataflow-service-options=min_num_workers
opção de serviço.
Estas sinalizações são opcionais.
Escala automática de streaming
Para tarefas de streaming, o escalamento automático horizontal permite que o Dataflow altere adaptativamente o número de trabalhadores em resposta a alterações no carregamento e na utilização de recursos.
A escala automática horizontal está ativada por predefinição para tarefas de streaming que usam o Streaming Engine. Para ativar a escala automática horizontal para tarefas de streaming que não usam o Streaming Engine, defina as seguintes opções de pipeline quando iniciar o pipeline:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
Substitua MAX_WORKERS pelo número máximo de instâncias de trabalho.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Substitua MAX_WORKERS pelo número máximo de instâncias de trabalho.
Go
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Substitua MAX_WORKERS pelo número máximo de instâncias de trabalho.
Para definir um limite inferior para o número de trabalhadores, defina a --dataflow-service-options=min_num_workers
opção de serviço.
Quando define este valor, o escalamento automático horizontal não é escalado abaixo do número de trabalhadores especificado. Esta flag é opcional.
Enquanto uma tarefa de streaming está em execução, pode atualizar o número mínimo e máximo de trabalhadores
através de uma
atualização de tarefa em curso.
Para ajustar as definições, defina os indicadores min-num-workers
e max-num-workers
.
Para mais informações, consulte o artigo
Atualize o intervalo de dimensionamento automático.
Desative o escalamento automático horizontal
Para desativar o dimensionamento automático horizontal, defina a seguinte opção de pipeline quando executar a tarefa.
Java
--autoscalingAlgorithm=NONE
Se desativar o dimensionamento automático horizontal, o Dataflow define o número de trabalhadores com base na opção --numWorkers
.
Python
--autoscaling_algorithm=NONE
Se desativar o dimensionamento automático horizontal, o Dataflow define o número de trabalhadores com base na opção --num_workers
.
Go
--autoscaling_algorithm=NONE
Se desativar o dimensionamento automático horizontal, o Dataflow define o número de trabalhadores com base na opção --num_workers
.
Fontes personalizadas
Se criar uma origem de dados personalizada, pode melhorar potencialmente o desempenho implementando métodos que forneçam mais informações ao algoritmo de escalabilidade automática horizontal:
Java
Fontes delimitadas
- Na subclasse
BoundedSource
, implemente o métodogetEstimatedSizeBytes
. O serviço Dataflow usagetEstimatedSizeBytes
quando calcula o número inicial de trabalhadores a usar para o seu pipeline. - Na subclasse
BoundedReader
, implemente o métodogetFractionConsumed
. O serviço Dataflow usagetFractionConsumed
para acompanhar o progresso da leitura e convergir para o número correto de trabalhadores a usar durante uma leitura.
Fontes ilimitadas
A origem tem de informar o serviço Dataflow sobre o backlog.
A fila de tarefas pendentes é uma estimativa da entrada em bytes que ainda não foi processada pela origem. Para informar o serviço sobre o backlog, implemente um dos seguintes métodos na sua classe UnboundedReader
.
getSplitBacklogBytes()
: registo pendente da divisão atual da origem. O serviço agrega o backlog em todas as divisões.getTotalBacklogBytes()
: o trabalho pendente global em todas as divisões. Em alguns casos, o trabalho pendente não está disponível para cada divisão e só pode ser calculado em todas as divisões. Apenas a primeira divisão (ID da divisão "0") tem de fornecer o total de pendências.
O repositório do Apache Beam contém vários
exemplos
de origens personalizadas que implementam a classe UnboundedReader
.
Python
Fontes delimitadas
- Na subclasse
BoundedSource
, implemente o métodoestimate_size
. O serviço Dataflow usaestimate_size
quando calcula o número inicial de trabalhadores a usar para o seu pipeline. - Na subclasse
RangeTracker
, implemente o métodofraction_consumed
. O serviço Dataflow usafraction_consumed
para acompanhar o progresso da leitura e convergir para o número correto de trabalhadores a usar durante uma leitura.
Go
Fontes delimitadas
- No seu
RangeTracker
, implemente o métodoGetProgress()
. O serviço Dataflow usaGetProgress
para acompanhar o progresso da leitura e convergir para o número correto de trabalhadores a usar durante uma leitura.
Limitações
- Em tarefas que executam o Dataflow Prime, a escala automática horizontal é desativada durante e até 10 minutos após a escala automática vertical. Para mais informações, consulte o artigo Efeito na escalabilidade automática horizontal.
- Para pipelines que não usam o Dataflow Shuffle, o Dataflow pode não conseguir reduzir a escala dos trabalhadores de forma eficaz porque os trabalhadores podem ter misturado dados armazenados em discos locais.
- A transformação PeriodicImpulse é suportada com o dimensionamento automático de streaming nas versões 2.60.0 e posteriores do SDK do Apache Beam. Se o seu pipeline usar
PeriodicImpulse
com uma versão anterior do SDK, os trabalhadores do Dataflow não são reduzidos conforme esperado.
O que se segue?
- Ajuste a escala automática horizontal para pipelines de streaming
- Monitorize o ajuste de escala automático do Dataflow
- Resolva problemas de dimensionamento automático do Dataflow