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 jobs do Dataflow, consulte Preços do Dataflow.

Vários fatores podem ter um grande impacto no custo do trabalho:

  • 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 do job e sugestões para melhorar a eficiência do pipeline.

Definir SLOs

Antes de começar a otimizar, 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 entender as compensações entre custo e outros fatores.

  • Se o pipeline exigir baixa latência de ingestão de ponta a ponta, os custos 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 seu job, primeiro é preciso entender o comportamento dele. Use as ferramentas de monitoramento do Dataflow para observar seu pipeline enquanto ele é executado. 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 em 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 um bom valor de referência para 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 custos nas tabelas de exportação de faturamento. Com a exportação do Cloud Billing, você exporta dados de faturamento detalhados automaticamente ao longo do dia para um conjunto de dados do BigQuery. Google Cloud 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 é possível melhorar a eficiência do pipeline.

  • Use a interface de monitoramento de jobs do Dataflow para identificar problemas nos seus pipelines. A interface de monitoramento mostra um gráfico de job e detalhes de execução para cada pipeline. As duas ferramentas podem ajudar você a entender seu pipeline e identificar etapas lentas, travadas ou com muito tempo real.
  • Use o Metrics Explorer para conferir métricas detalhadas de jobs do Dataflow. É possível usar métricas personalizadas para capturar dados de performance. A métrica Distribution é especialmente útil para coletar dados de performance.
  • Para pipelines com uso intenso da 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.
  • Personalize o painel de monitoramento do projeto para mostrar jobs potencialmente caros. Para mais informações, consulte Personalizar o painel de monitoramento do Dataflow.

Não é recomendável registrar métricas de processamento por elemento em pipelines de alto volume, porque o registro está sujeito a limites, e o registro excessivo pode prejudicar o desempenho do job.

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

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

  • Se você executa um job de streaming ou em job 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)

Nesta seção, descrevemos possíveis mudanças que podem ser feitas para otimizar seu 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 adequadas ou úteis para todos os pipelines.

Antes de fazer mudanças em grande escala, teste em pipelines pequenos 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 armazenamentos 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 um bucket do Cloud Storage para armazenar arquivos de preparo e de job temporários na mesma região do seu job. Para mais informações, consulte as gcpTempLocation e temp_location opções de pipeline.

Ajustar tipos de máquina

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

  • 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 do padrão. Para mais informações, consulte Tipo de máquina.
  • Para cargas de trabalho com uso intensivo 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 é escalonado verticalmente, o trabalho precisa ser redistribuído para as novas VMs. Se você souber de quantos workers seus jobs precisam, evite 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. Ao testar o pipeline pela primeira vez, comece com um 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 os SLOs do pipeline antes de definir um máximo. Para mais informações, consulte Escalonamento automático horizontal.
  • Use o ajuste direito para personalizar os requisitos de recursos para etapas específicas do pipeline.
  • Alguns pipelines se beneficiam do uso de GPUs. Para mais informações, consulte GPUs com Dataflow. Com o ajuste adequado, é possível configurar GPUs para etapas específicas do pipeline.
  • Verifique se você tem largura de banda de rede suficiente para acessar dados das VMs de worker, principalmente quando precisar acessar dados locais.

Otimizar configurações para jobs em lote

Nesta seção, apresentamos sugestões para otimizar as configurações de tempo de execução de jobs 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 sensível ao tempo, use o Flexible Resource Scheduling (FlexRS). A FlexRS reduz os custos de processamento em lote ao encontrar o melhor momento para iniciar o job e usar uma combinação de instâncias de VM preemptiva e VMs padrão. As VMs preemptivas estão disponíveis a um preço muito menor em comparação com as VMs padrão, o que pode reduzir o custo total. Ao usar uma combinação de VMs preemptivas e padrão, o FlexRS ajuda a garantir que o pipeline progrida mesmo que o Compute Engine force a interrupção das VMs preemptivas.

Evite executar jobs muito pequenos

Quando possível, evite executar jobs que processem quantidades muito pequenas de dados. Se possível, execute menos jobs em conjuntos de dados maiores. Iniciar e interromper VMs de worker gera um custo. Por isso, 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 curta duração, o escalonamento automático não é necessário. Se você acha que seu 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

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

Otimizar configurações para jobs de streaming

Nesta seção, apresentamos sugestões para otimizar as configurações de tempo de execução dos jobs 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 Dataflow, aumentando a eficiência. Recomendamos 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: o modo "exatamente uma vez" e o modo "pelo menos uma vez". Se a carga de trabalho 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.

Escolher um modelo de preços

Os descontos por compromisso de uso (CUDs) para jobs de streaming do Dataflow oferecem preços com desconto 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 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 considere usar o 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 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 parar ou substituir o job. Para mais informações, consulte Atualização de opções de jobs em andamento.

Se você acha que seu pipeline não se beneficia do escalonamento automático, desative-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 atualizaçã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

Pipelines que são executados mais rápido podem custar menos. Os fatores a seguir podem afetar o desempenho do pipeline:

  • O paralelismo disponível para seu 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 que ele usa. Os jobs do Dataflow usam várias VMs de worker, e cada worker executa várias linhas de execução. 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 gerar registros:

Teste

Testar seu pipeline tem muitos benefícios, incluindo ajuda com upgrades do 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 precisar executar um job no Dataflow.

Teste pipelines de 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 de duas maneiras: 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, de integração e de ponta a ponta, consulte Testar seu pipeline. Para ver exemplos de testes, consulte o repositório do GitHub dataflow-ordered-processing.

A seguir