Práticas recomendadas para otimização de custos do Dataflow

Este documento explica as práticas recomendadas para otimizar seus jobs do Dataflow com o objetivo de minimizar custos. Ele explica os fatores que afetam os custos e fornece técnicas para monitorar e gerenciar esses custos.

Para mais informações sobre como os custos são calculados para trabalhos do Dataflow, consulte Preços do Dataflow.

Vários fatores podem ter um grande impacto no custo do serviço:

  • Configurações do ambiente de execução
  • Desempenho do pipeline
  • Requisitos de capacidade de processamento do pipeline

As seções a seguir fornecem detalhes sobre como monitorar seus jobs, fatores que afetam o custo deles e sugestões para melhorar a eficiência do pipeline.

Definir SLOs

Antes de começar a otimização, defina os objetivos de nível de serviço (SLOs) do pipeline, principalmente para capacidade e latência. Esses requisitos vão ajudar você a refletir sobre as compensações entre custo e outros fatores.

  • Se o pipeline exigir baixa latência de ingestão de ponta a ponta, os custos dele poderão ser mais altos.
  • Se você precisar processar dados que chegam atrasados, o custo geral do pipeline poderá ser maior.
  • Se o pipeline de streaming tiver picos de dados que precisam ser processados, ele poderá precisar de capacidade extra, o que pode aumentar os custos.

Monitorar jobs

Para determinar como otimizar o job, primeiro é preciso entender o comportamento dele. Use as ferramentas de monitoramento do Dataflow para observar o pipeline durante a execução. Em seguida, use essas informações para melhorar a performance e a eficiência.

Monitoramento de custos

Use as técnicas a seguir para prever e monitorar custos.

  • Antes de executar o pipeline na produção, execute um ou mais jobs menores em um subconjunto dos seus dados. Para muitos pipelines, essa técnica pode fornecer uma estimativa de custo.
  • Use a página Custo na interface de monitoramento do Dataflow para monitorar o custo estimado dos seus jobs. O custo estimado pode não refletir o custo real do job por vários motivos, como descontos contratuais, mas pode fornecer uma boa referência para a otimização de custos. Para mais informações, consulte Monitoramento de custos.
  • Exporte os dados do Cloud Billing para o BigQuery e faça uma análise de custo nas tabelas de exportação de faturamento. A exportação do Cloud Billing permite exportar dados de faturamento Google Cloud detalhados automaticamente durante o dia para um conjunto de dados do BigQuery. Os dados de faturamento incluem uso, estimativas de custo e dados de preços.
  • Para evitar custos inesperados, crie alertas de monitoramento quando o job do Dataflow exceder um limite definido por você. Para mais informações, consulte Usar o Cloud Monitoring em pipelines do Dataflow.

Monitoramento de jobs

Monitore seus jobs e identifique áreas em que você pode melhorar a eficiência do pipeline.

  • Use a interface de monitoramento de jobs do Dataflow para identificar problemas nos pipelines. A interface de monitoramento mostra um gráfico de job e detalhes de execução para cada pipeline. Essas duas ferramentas podem ajudar a entender seu pipeline e identificar etapas lentas, travadas ou etapas com muito tempo de parede.
  • Use o Metrics Explorer para conferir as métricas detalhadas dos jobs do Dataflow. É possível usar métricas personalizadas para capturar dados de desempenho. A métrica Distribution é especialmente útil para coletar dados de performance.
  • Para pipelines com uso intensivo de CPU, use o Cloud Profiler para identificar as partes do código do pipeline que consomem mais recursos.
  • Use a amostragem de dados para identificar problemas com seus dados. Com a amostragem de dados, é possível observar os dados em cada etapa de um pipeline do Dataflow. Ao mostrar as entradas e saídas reais em um job em execução ou concluído, essas informações podem ajudar você a depurar problemas com o pipeline.

Não é recomendável registrar métricas de processamento por elemento em pipelines de alto volume, porque a geração de registros está sujeita a limites, e a geração excessiva de registros pode degradar a performance do job.

Otimizar as configurações do ambiente de execução

As seguintes configurações de execução podem afetar o custo:

  • Se você executa um job de streaming ou em lote
  • Qual serviço você usa para executar o job, como o Streaming Engine ou o FlexRS
  • O tipo de máquina, o tamanho do disco e o número de GPUs nas VMs de worker
  • O modo de escalonamento automático
  • O número inicial e máximo de workers
  • O modo de streaming (exatamente uma vez ou pelo menos uma vez)

Esta seção descreve possíveis mudanças que você pode fazer para otimizar o trabalho. Para determinar se essas sugestões são adequadas para sua carga de trabalho, considere o design e os requisitos do pipeline. Nem todas as sugestões são apropriadas ou úteis para todos os pipelines.

Antes de fazer mudanças em grande escala, teste as alterações em pequenos pipelines que usam um subconjunto dos seus dados. Para mais informações, consulte Executar experimentos pequenos para trabalhos grandes em "Práticas recomendadas para pipelines de lotes grandes".

Local da vaga

A maioria dos jobs do Dataflow interage com outros serviços, como repositórios de dados e sistemas de mensagens. Considere onde eles estão localizados.

  • Execute o job na mesma região dos recursos que ele usa.
  • Crie o bucket do Cloud Storage para armazenar arquivos de preparação e jobs temporários na mesma região do job. Para mais informações, consulte as opções de pipeline gcpTempLocation e temp_location.

Ajustar tipos de máquina

Os ajustes a seguir nas VMs de trabalho podem melhorar a eficiência dos custos.

  • Execute o job com o menor tipo de máquina necessário. Ajuste o tipo de máquina conforme necessário com base nos requisitos do pipeline. Por exemplo, jobs de streaming com pipelines que exigem muito da CPU às vezes se beneficiam da mudança do tipo de máquina padrão. Para mais informações, consulte Tipo de máquina.
  • Para cargas de trabalho com uso intenso de memória ou computação, use os tipos de máquina adequados. Para mais informações, consulte Pontuações do CoreMark de VMs por família.
  • Defina o número inicial de workers. Quando um job é dimensionado, o trabalho precisa ser redistribuído para as novas VMs. Se você souber quantos workers seus jobs precisam, é possível evitar esse custo definindo o número inicial de workers. Para definir o número inicial de workers, use a opção de pipeline numWorkers ou num_workers.
  • Defina o número máximo de workers. Ao definir um valor para esse parâmetro, você pode limitar o custo total do job. Quando você testar o pipeline pela primeira vez, comece com um valor máximo relativamente baixo. Em seguida, aumente o valor até que ele seja alto o suficiente para executar uma carga de trabalho de produção. Considere seus SLOs de pipeline antes de definir um valor máximo. Para mais informações, consulte Escalonamento automático horizontal.
  • Alguns pipelines se beneficiam do uso de GPUs. Para mais informações, consulte GPUs com o Dataflow.
  • Verifique se você tem largura de banda de rede suficiente para acessar dados das VMs de worker, principalmente quando precisar acessar dados locais.

Otimizar as configurações para jobs em lote

Esta seção oferece sugestões para otimizar as configurações de execução de trabalhos em lote. Para jobs em lote, as etapas são executadas sequencialmente, o que pode afetar a performance e o custo.

Usar a programação flexível de recursos

Se o job em lote não for urgente, use o recurso de programação flexível (FlexRS). A FlexRS reduz os custos de processamento em lote ao encontrar o melhor momento para iniciar o job e, em seguida, usar uma combinação de instâncias de VMs preemptivas e VMs padrão. As VMs preemptivas estão disponíveis a um preço muito mais baixo em comparação com as VMs padrão, o que pode reduzir o custo total. Ao usar uma combinação de VMs padrão e preemptivas, o FlexRS ajuda a garantir que seu pipeline progrida, mesmo que o Compute Engine interrompa as VMs preemptivas.

Evite executar jobs muito pequenos

Quando possível, evite executar jobs que processam quantidades muito pequenas de dados. Se possível, execute menos jobs em conjuntos de dados maiores. A inicialização e a interrupção de VMs de worker geram custos. Portanto, executar menos jobs com mais dados pode melhorar a eficiência.

Verifique se o Dataflow Shuffle está ativado. Os jobs em lote usam o Dataflow Shuffle por padrão.

Ajustar as configurações de escalonamento automático

Por padrão, os jobs em lote usam o escalonamento automático. Para alguns jobs, como os de execução curta, o escalonamento automático não é necessário. Se você acha que o pipeline não se beneficia do escalonamento automático, desative-o. Para mais informações, consulte Escalonamento automático horizontal.

Também é possível usar o escalonamento dinâmico de linhas de execução para permitir que o Dataflow ajuste a contagem de linhas de execução com base na utilização da CPU. Como alternativa, se você souber o número ideal de linhas de execução para o job, defina explicitamente o número de linhas de execução por worker usando a opção de pipeline numberOfWorkerHarnessThreads ou number_of_worker_harness_threads.

Interromper jobs de longa duração

Configure seus jobs para que sejam interrompidos automaticamente se excederem um tempo de execução predeterminado. Se você souber aproximadamente quanto tempo o job leva para ser executado, use a max_workflow_runtime_walltime_seconds opção de serviço para interromper automaticamente o job se ele for executado por mais tempo do que o esperado.

Otimizar as configurações para jobs de streaming

Esta seção fornece sugestões para otimizar as configurações de execução para trabalhos de streaming.

Usar o Streaming Engine

O Streaming Engine move a execução do pipeline das VMs de worker para o back-end do serviço do Dataflow para maior eficiência. É recomendável usar o Streaming Engine para seus jobs de streaming.

Considere o modo "Pelo menos uma vez"

O Dataflow é compatível com dois modos de jobs de streaming: "Exatamente uma vez" e "Pelo menos uma vez". Se a carga de trabalho puder tolerar registros duplicados, o modo pelo menos uma vez pode reduzir significativamente o custo do job. Antes de ativar o modo pelo menos uma vez, avalie se o pipeline exige o processamento exatamente uma vez de registros. Para mais informações, consulte Definir o modo de streaming do pipeline.

Escolha seu modelo de preços

Os descontos por compromisso de uso (CUDs) para jobs de streaming do Dataflow oferecem descontos em troca do compromisso de usar continuamente uma determinada quantidade de recursos de computação do Dataflow por um ano ou mais. Os CUDs do Dataflow são úteis quando os gastos com a capacidade de computação do Dataflow para jobs de streaming envolvem um mínimo previsível com o qual você pode se comprometer por pelo menos um ano. Ao usar CUDs, é possível reduzir o custo dos jobs do Dataflow.

Também recomendamos o uso do faturamento baseado em recursos. Com o faturamento baseado em recursos, os recursos do Streaming Engine consumidos pelo job são medidos em Unidades de computação do Streaming Engine. Você receberá cobranças pela CPU e pela memória do worker e pelas unidades de computação do Streaming Engine.

Ajustar as configurações de escalonamento automático

Use as dicas de escalonamento automático para ajustar as configurações. Para mais informações, consulte Ajustar o escalonamento automático horizontal para pipelines de streaming. Para jobs de streaming que usam o Streaming Engine, é possível atualizar as configurações de ajuste automático sem interromper ou substituir o job. Para mais informações, consulte Atualização de opções de jobs em andamento.

Se você acha que o pipeline não se beneficia do escalonamento automático, desative essa opção. Para mais informações, consulte Escalonamento automático horizontal.

Se você souber o número ideal de linhas de execução para o job, defina explicitamente o número de linhas de execução por worker usando a opção de pipeline numberOfWorkerHarnessThreads ou number_of_worker_harness_threads.

Interromper jobs de longa duração

Para jobs de streaming, o Dataflow repete os itens de trabalho com falha indefinidamente. O job não será encerrado. No entanto, o job pode parar até que o problema seja resolvido. Crie políticas de monitoramento para detectar sinais de um pipeline parado, como um aumento na latência do sistema e uma diminuição na atuação de dados. Implemente a geração de registros de erros no código do pipeline para ajudar a identificar itens de trabalho que falham repetidamente.

Desempenho do pipeline

Os pipelines que são executados mais rapidamente podem custar menos. Os fatores a seguir podem afetar a performance do pipeline:

  • O paralelismo disponível para o job
  • A eficiência das transformações, dos conectores de E/S e dos codificadores usados no pipeline
  • O local dos dados

A primeira etapa para melhorar a performance do pipeline é entender o modelo de processamento:

  • Saiba mais sobre o modelo do Apache Beam e o modelo de execução do Apache Beam.
  • Saiba mais sobre o ciclo de vida do pipeline, incluindo como o Dataflow gerencia a paralelização e as estratégias de otimização usadas. Os jobs do Dataflow usam várias VMs de worker, e cada worker executa várias linhas de execução. Os pacotes de elementos de um PCollection são distribuídos para cada linha de execução do worker.

Use estas práticas recomendadas ao escrever o código do pipeline:

Logging

Siga estas práticas recomendadas ao fazer o registro:

Teste

Testar seu pipeline tem muitos benefícios, incluindo ajuda com upgrades de SDK, refatoração de pipeline e revisões de código. Muitas otimizações, como a reformulação de transformações personalizadas que exigem muito da CPU, podem ser testadas localmente sem a necessidade de executar um job no Dataflow.

Teste pipelines em grande escala com dados de teste realistas para sua carga de trabalho, incluindo o número total de elementos para pipelines em lote, o número de elementos por segundo para pipelines de streaming, o tamanho do elemento e o número de chaves. Teste seus pipelines em dois modos: em um estado estável e processando um grande backlog para simular uma recuperação de falha.

Para mais informações sobre como criar testes de unidade, testes de integração e testes de ponta a ponta, consulte Testar seu pipeline. Para conferir exemplos de testes, consulte o repositório do GitHub dataflow-ordered-processing.

A seguir