Escala dinâmica de linhas de execução

O escalonamento dinâmico de linhas de execução faz parte do pacote de recursos de escalonamento vertical do Dataflow. Ele complementa o recurso de escalonamento automático horizontal do Dataflow ajustando o número de tarefas paralelas, também conhecidas como pacotes, que são executadas por cada worker do Dataflow. O objetivo é aumentar a eficiência geral do pipeline do Dataflow.

Quando o Dataflow executa um pipeline, o processamento é distribuído por várias máquinas virtuais (VMs) do Compute Engine, também conhecidas como workers. Uma linha de execução é uma única tarefa executável em um processo maior. O Dataflow inicia várias linhas de execução em cada worker.

Com o escalonamento dinâmico de linhas de execução ativado, o serviço Dataflow escolhe automaticamente o número apropriado de linhas de execução a serem executadas em cada worker do Dataflow. Como cada linha de execução realiza uma tarefa, aumentar o número de linhas de execução permite que mais tarefas sejam realizadas em paralelo em um worker. Quando você usa esse recurso com o recurso de escalonamento automático horizontal, o número total de linhas de execução usado pelo pipeline permanece igual, mas menos workers são usados.

O escalonamento dinâmico de linhas de execução usa um algoritmo para determinar quantas linhas de execução cada worker precisa com base nos sinais de utilização de recursos gerados durante a execução do pipeline. Para mais informações, consulte a seção Como funciona nesta página.

Vantagens

O escalonamento dinâmico de linhas de execução tem os possíveis benefícios a seguir.

  • Permite que os workers do Dataflow processem dados com mais eficiência, melhorando a utilização de CPU e memória por worker.
  • Melhora o processamento paralelo, ajustando o número de linhas de execução de worker disponíveis para executar tarefas em paralelo durante a execução do pipeline.
  • Reduz o número de workers necessários para processar grandes conjuntos de dados, o que pode reduzir os custos.

Suporte e limitações

  • O escalonamento dinâmico de linhas de execução está disponível para pipelines que usam os SDKs para Java, Python e Go.
  • O job do Dataflow precisa usar o Runner v2.
  • Somente pipelines em lote são compatíveis.
  • Pipelines de uso intensivo de CPU ou memória podem não se beneficiar do escalonamento dinâmico de linhas de execução.
  • O escalonamento dinâmico de linhas de execução não reduz o tempo necessário para concluir um job do Dataflow.

Como funciona

O escalonamento dinâmico de linhas de execução usa princípios de ajuste automático para aumentar ou diminuir dinamicamente a contagem de linhas de execução em cada worker no pool de workers do Dataflow. A contagem de linhas de execução é escalonada de forma independente em cada worker. Cada linha de execução realiza uma tarefa. Aumentar o número de linhas de execução permite que mais tarefas sejam realizadas em paralelo em um worker. À medida que as tarefas são concluídas e as linhas de execução não são mais necessárias, a escala vertical da contagem de linhas de execução é reduzida. Um algoritmo determina quantas linhas de execução cada worker precisa.

A contagem de linhas de execução em um worker é escalonada até um máximo de duas por vCPU quando as duas condições a seguir são atendidas:

  • A utilização de memória no worker é inferior a 50%.
  • O uso da CPU no worker é inferior a 65%.

A contagem de linhas de execução de um worker é reduzida para o mínimo de uma linha de execução por vCPU quando a seguinte condição é atendida:

  • A utilização de memória no worker é superior a 70%.

Para visualizar a utilização de memória e CPU do job, use a guia Métricas do job da interface da Web do Dataflow.

Para garantir que as recomendações sejam válidas, o Dataflow aguarda a utilização de recursos ser estabilizada antes de enviar recomendações aos workers. Por exemplo, a utilização de memória e CPU pode estar no intervalo de escalonamento, mas como a utilização de recursos ainda está crescendo, o Dataflow não envia uma recomendação. Depois que a utilização de recursos é estabilizada, o Dataflow envia uma recomendação.

Se ocorrer um erro de falta de memória (OOM, na sigla em inglês), o escalonamento de linhas de execução será desativado automaticamente e o pipeline será executado com uma linha de execução por vCPU.

Ativar o escalonamento dinâmico de linhas de execução

Para ativar o escalonamento dinâmico de linhas de execução, use a seguinte opção do serviço Dataflow.

Java

--dataflowServiceOptions=enable_dynamic_thread_scaling

Python

--dataflow_service_options=enable_dynamic_thread_scaling

Go

--dataflow_service_options=enable_dynamic_thread_scaling

Quando o escalonamento dinâmico de linhas de execução está ativado, também é possível definir o número inicial e máximo de workers disponíveis para o pipeline durante a execução. Para mais informações, consulte Opções de pipeline.

Verificar se o escalonamento dinâmico de linhas de execução está ativado

Quando o escalonamento dinâmico de linhas de execução está ativado, a seguinte mensagem aparece nos arquivos de registro do worker:

Enabling thread vertical scaling feature in worker.

Para ver os arquivos de registro do worker, na Análise de registros, use o painel Consulta para filtrar os registros por Nome do registro. Use o seguinte nome do registro no seu filtro:

projects/PROJECT_ID/logs/dataflow.googleapis.com%2Fharness

É possível ver o número recomendado de linhas de execução nos arquivos de registro do worker. A mensagem a seguir inclui o número recomendado de linhas de execução:

worker_thread_scaling_report_response { recommended_thread_count: NUMBER }

Se a utilização de recursos não estiver no intervalo de escalonamento, o valor exibido será igual ao número de vCPUs no worker.

Também é possível usar o console do Google Cloud para ver se o escalonamento dinâmico de linhas de execução está ativado. Quando está ativado, no painel Informações do job do Dataflow, na linha dataflowServiceOptions da seção Opções de pipeline, enable_dynamic_thread_scaling é exibido.

Solução de problemas

Esta seção contém instruções para solucionar problemas comuns relacionados ao escalonamento dinâmico de linhas de execução.

O desempenho diminui com o escalonamento dinâmico de linhas de execução ativado

Aumentar a contagem de linhas de execução pode causar problemas de desempenho nos seguintes casos:

  • Quando vários processos tentam usar o mesmo recurso, um processo consegue usá-lo enquanto os outros precisam esperar. Essa situação é conhecida como contenção de recursos. Quando ocorre a contenção de recursos, o desempenho do pipeline pode diminuir.
  • Quando ocorrem erros de falta de memória, o escalonamento dinâmico de linhas de execução é desativado. Em alguns casos, erros de falta de memória podem causar falha no pipeline.

Verifique se a contagem de linhas de execução aumentou. Para informações sobre como verificar a contagem de linhas de execução recomendadas, consulte Verificar se o escalonamento de linhas de execução está ativado nesta página.

Se o escalonamento de linhas de execução estiver ativado, para resolver esse problema, não inclua a opção de serviço de escalonamento dinâmico de linhas de execução quando o pipeline for executado.

Worker unificado… ativado e desativado

Depois de ativar o escalonamento dinâmico de linhas de execução, o job pode falhar e apresentar o seguinte erro:

The workflow could not be created. Causes: (ID): Unified worker misconfigured by user and was both enabled and disabled.

Esse erro ocorre quando o Runner v2 está explicitamente desativado.

Para resolver esse problema, ative o Runner v2. Para mais informações, consulte a seção Ativar o Dataflow Runner v2 na página "Usar o Dataflow Runner v2".

Fazer upgrade do SDK

Depois de ativar o escalonamento dinâmico de linhas de execução, o job pode falhar e apresentar o seguinte erro:

Java

Dataflow Runner v2 requires the Apache Beam Java SDK version 2.29.0 or higher. Please upgrade your SDK and resubmit your job.

Python

Dataflow Runner v2 requires the Apache Beam SDK, version 2.21.0 or higher. Please upgrade your SDK and resubmit your job.

Esse erro ocorre quando o Runner v2 não pode ser ativado porque a versão do SDK não é compatível com ele.

Para resolver esse problema, use uma versão do SDK compatível com o Runner v2.

Não é possível ativar o recurso de escalonamento vertical de linhas de execução

Depois de ativar o escalonamento dinâmico de linhas de execução, o job pode falhar e apresentar o seguinte erro:

The workflow could not be created. Causes: (ID): Thread vertical scaling feature can not be enabled while number_of_worker_harness_threads is specified.

Esse erro ocorre quando o pipeline define explicitamente o número de linhas de execução por worker usando a opção de pipeline numberOfWorkerHarnessThreads ou number_of_worker_harness_threads.

Para resolver esse problema, remova a opção de pipeline numberOfWorkerHarnessThreads ou number_of_worker_harness_threads do seu pipeline.