Este documento explica as práticas recomendadas para otimizar os jobs do Dataflow com o objetivo de minimizar os 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 job:
- Configurações do tempo 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, os fatores que afetam o custo do job e sugestões de como 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, especialmente para capacidade de processamento 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 do pipeline 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 você precisa entender o comportamento dele. Use as ferramentas de monitoramento do Dataflow para observar o pipeline em 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 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 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 linha de base 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 custos nas tabelas de exportação de faturamento. A exportação do Cloud Billing permite exportar dados detalhados Google Cloud de faturamento automaticamente ao longo do 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. 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 jobs e detalhes de execução para cada pipeline. Essas duas ferramentas podem ajudar você a entender o pipeline e identificar estágios lentos, estágios presos ou etapas com muito tempo decorrido.
- 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é particularmente útil para coletar dados de performance. - Para pipelines com uso intenso de CPU, use Cloud Profiler para identificar as partes do código do pipeline que consomem mais recursos.
- Use a amostragem de dados para identificar problemas com os 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 degradar a performance do job.
Otimizar as configurações do ambiente de execução
As configurações do ambiente de execução a seguir podem afetar o custo:
- Se você executa um job de streaming ou um job em lote
- Qual serviço você usa para executar o job, como o Streaming Engine ou a 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 de workers e o número máximo de workers
- O modo de streaming (modo "Exatamente uma vez" ou "Pelo menos uma vez")
Esta seção descreve possíveis mudanças que você pode fazer para otimizar o job. 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 as mudanças em pipelines pequenos que usam um subconjunto dos dados. Para mais informações, consulte Executar experimentos pequenos para trabalhos grandes em "Práticas recomendadas para pipelines em lote 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 o bucket do Cloud Storage para armazenar arquivos de preparação e temporários de jobs na mesma região do job. Para mais informações, consulte as
gcpTempLocationetemp_locationopções de pipeline.
Ajustar tipos de máquina
Os ajustes a seguir nas VMs de worker podem melhorar a eficiência de 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 com uso intenso de 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 intenso de memória ou computação, use 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, o trabalho precisa ser redistribuído para as novas VMs. Se você souber quantos workers seus jobs precisam, poderá evitar esse custo definindo o número inicial de workers. Para definir
o número inicial de workers, use a opção de pipeline
numWorkersounum_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. Ao usar o ajuste direito, é 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 as configurações para jobs em lote
Esta seção fornece sugestões para otimizar as configurações do ambiente de execução para jobs em lote. Para jobs em lote, os estágios do job são executados 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, considere usar a Programação flexível de recursos (FlexRS). A FlexRS reduz os custos de processamento em lote encontrando o melhor momento para iniciar o job e usando uma combinação de instâncias de VM 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 preemptivas e padrão, a FlexRS ajuda a garantir que o pipeline progrida mesmo que o Compute Engine force a interrupção das VMs preemptivas.
Evitar a execução de 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. Iniciar e parar VMs de worker gera um custo. Portanto, executar menos jobs em 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 jobs de curta duração, 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
escala dinâmica 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
.
Parar jobs de longa duração
Defina seus jobs para parar 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 parar o job automaticamente 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 do ambiente de execução para 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 do Dataflow para maior eficiência. Recomendamos usar o Streaming Engine para jobs de streaming.
Considerar o modo "Pelo menos uma vez"
O Dataflow é compatível com dois modos de jobs de streaming: modo "Exatamente uma vez" e modo "Pelo menos uma vez". Se a carga de trabalho puder tolerar registros duplicados, o modo "Pelo menos uma vez" poderá 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 o modelo de preç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 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, você pode reduzir o custo dos jobs do Dataflow.
Considere também usar o faturamento baseado em recursos. Com o faturamento baseado em recursos, os recursos do Streaming Engine consumidos pelo seu 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 de escalonamento automático. 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 trânsito.
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.
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
.
Parar 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.
- Para monitorar erros de pipeline, consulte Contagem de registros de erros do worker.
- Para resolver erros, consulte Resolver erros do Dataflow.
Desempenho do pipeline
Pipelines que são executados mais rapidamente podem custar menos. Os seguintes fatores 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 que ele usa. 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 uma
PCollectionsão distribuídos para cada linha de execução de worker.
Use estas práticas recomendadas ao escrever o código do pipeline:
- Quando possível, use a versão mais recente do SDK do Apache Beam. Siga as notas de lançamento para entender as mudanças em diferentes versões.
- Siga as práticas recomendadas para escrever código de pipeline.
- Siga as práticas recomendadas do conector de E/S.
- Para pipelines do Python, considere usar contêineres personalizados. A pré-embalagem de dependências diminui o tempo de inicialização do worker.
Logging
Siga estas práticas recomendadas ao fazer o registro:
- O registro excessivo pode prejudicar a performance.
- Para reduzir o volume de registros, considere mudar o nível de registro do pipeline. Para mais informações, consulte Controlar o volume de registros.
- Não registre elementos individuais. Ative a amostragem de dados em vez disso.
- Use um padrão de fila de mensagens não entregues para erros por elemento, em vez de registrar cada erro.
Teste
Testar o pipeline tem muitos benefícios, incluindo ajudar 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 com uso intenso de CPU, podem ser testadas localmente sem precisar 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 os 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 o pipeline.
Para exemplos de testes, consulte o
dataflow-ordered-processing
repositório do GitHub.
A seguir
- Planeje o pipeline do Dataflow
- Desenvolver e testar pipelines do Dataflow
- Resolver problemas de pipelines