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

Este documento explica as práticas recomendadas para otimizar as suas tarefas do Dataflow com o objetivo de minimizar os custos. Explica os fatores que afetam os custos e fornece técnicas para monitorizar e gerir esses custos.

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

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

  • Definições do tempo de execução
  • Desempenho do pipeline
  • Requisitos de débito do pipeline

As secções seguintes fornecem detalhes sobre como monitorizar os seus trabalhos, os fatores que afetam o custo dos trabalhos e sugestões sobre como melhorar a eficiência do pipeline.

Defina SLOs

Antes de começar a otimizar, defina os objetivos ao nível do serviço (SLOs) do seu pipeline, especialmente para o débito e a latência. Estes requisitos ajudam a compreender os compromissos entre o custo e outros fatores.

  • Se o seu pipeline exigir uma latência de carregamento de ponta a ponta baixa, os custos do pipeline podem ser mais elevados.
  • Se precisar de processar dados que chegam com atraso, o custo geral do pipeline pode ser superior.
  • Se o seu pipeline de streaming tiver picos de dados que precisam de ser processados, o pipeline pode precisar de capacidade adicional, o que pode aumentar os custos.

Monitorize tarefas

Para determinar como otimizar a tarefa, primeiro tem de compreender o respetivo comportamento. Use as ferramentas de monitorização do Dataflow para observar o seu pipeline à medida que é executado. Em seguida, use estas informações para melhorar o desempenho e a eficiência.

Monitorização de custos

Use as seguintes técnicas para prever e monitorizar os custos.

  • Antes de executar o pipeline em produção, execute uma ou mais tarefas mais pequenas num subconjunto dos seus dados. Para muitos pipelines, esta técnica pode fornecer uma estimativa de custos.
  • Use a página Custo na interface de monitorização do Dataflow para monitorizar o custo estimado dos seus trabalhos. O custo estimado pode não refletir o custo real do trabalho por vários motivos, como descontos contratuais, mas pode fornecer uma boa base para a otimização de custos. Para mais informações, consulte o artigo Monitorização de custos.
  • Exporte dados de faturação do Google Cloud para o BigQuery e faça uma análise de custos nas tabelas de exportação de faturação. A exportação da faturação do Google Cloud permite-lhe exportar automaticamente dados de faturação detalhados da Google Cloud Platform para um conjunto de dados do BigQuery ao longo do dia. Os dados de faturação incluem a utilização, as estimativas de custos e os dados de preços.
  • Para evitar custos inesperados, crie alertas de monitorização quando a tarefa do Dataflow exceder um limite que definir. Para mais informações, consulte o artigo Use o Cloud Monitoring para pipelines do Dataflow.

Monitorização de tarefas

Monitorize os seus trabalhos e identifique áreas onde pode melhorar a eficiência do pipeline.

Não é recomendável registar métricas de processamento por elemento em pipelines de volume elevado, porque o registo está sujeito a limites e o registo excessivo pode degradar o desempenho da tarefa.

Otimize as definições de tempo de execução

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

  • Se executa uma tarefa de streaming ou uma tarefa em lote
  • Que serviço usa para executar a tarefa, 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 trabalho
  • O modo de escalabilidade automática
  • O número inicial de trabalhadores e o número máximo de trabalhadores
  • O modo de streaming (modo exatamente uma vez ou modo pelo menos uma vez)

Esta secção descreve as potenciais alterações que pode fazer para otimizar o seu trabalho. Para determinar se estas sugestões são adequadas para a sua carga de trabalho, tenha em conta o design e os requisitos do pipeline. Nem todas as sugestões são adequadas ou úteis para todos os pipelines.

Antes de fazer alterações em grande escala, teste as alterações em pequenos pipelines que usam um subconjunto dos seus dados. Para mais informações, consulte o artigo Execute pequenas experiências para tarefas grandes em "Práticas recomendadas para pipelines de processamento em lote grandes".

Localização do emprego

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

  • Execute a tarefa na mesma região que os recursos usados pela tarefa.
  • Crie o seu contentor do Cloud Storage para armazenar ficheiros de preparação e de tarefas temporários na mesma região que a sua tarefa. Para mais informações, consulte as gcpTempLocation e as temp_location opções de pipeline.

Ajuste os tipos de máquinas

Os seguintes ajustes às VMs de trabalho podem melhorar a eficiência de custos.

  • Execute a tarefa com o tipo de máquina mais pequeno necessário. Ajuste o tipo de máquina conforme necessário com base nos requisitos do pipeline. Por exemplo, as tarefas de streaming com pipelines com utilização intensiva da CPU beneficiam, por vezes, da alteração do tipo de máquina do predefinido. Para mais informações, consulte o artigo Tipo de máquina.
  • Para cargas de trabalho com utilização intensiva de memória ou computação, use tipos de máquinas adequados. Para mais informações, consulte o artigo Resultados do CoreMark das VMs por família.
  • Defina o número inicial de trabalhadores. Quando uma tarefa é dimensionada, o trabalho tem de ser redistribuído para as novas VMs. Se souber de quantos trabalhadores as suas tarefas precisam, pode evitar este custo definindo o número inicial de trabalhadores. Para definir o número inicial de trabalhadores, use a numWorkers ou a num_workers opção de pipeline.
  • Defina o número máximo de trabalhadores. Ao definir um valor para este parâmetro, pode potencialmente limitar o custo total da sua tarefa. Quando testar o pipeline pela primeira vez, comece com um máximo relativamente baixo. Em seguida, aumente o valor até ser suficientemente elevado 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 o artigo Escalamento automático horizontal.
  • Use o ajuste certo para personalizar os requisitos de recursos para passos específicos do pipeline.
  • Alguns pipelines beneficiam da utilização de GPUs. Para mais informações, consulte o artigo GPUs com o Dataflow. Ao usar o ajuste preciso, pode configurar GPUs para passos específicos do pipeline.
  • Certifique-se de que tem largura de banda da rede suficiente para aceder aos dados das suas VMs de trabalho, especialmente quando precisa de aceder a dados no local.

Otimize as definições para tarefas em lote

Esta secção fornece sugestões para otimizar as definições de tempo de execução para tarefas em lote. Para tarefas em lote, as fases da tarefa são executadas sequencialmente, o que pode afetar o desempenho e o custo.

Use o agendamento flexível de recursos

Se o seu trabalho em lote não for sensível ao tempo, considere usar o agendamento flexível de recursos (FlexRS). O FlexRS reduz os custos de processamento em lote ao encontrar a melhor altura para iniciar a tarefa e, em seguida, usar uma combinação de instâncias de VMs preemptíveis e VMs padrão. As VMs preemptivas estão disponíveis a um preço muito inferior em comparação com as VMs padrão, o que pode reduzir o custo total. Ao usar uma combinação de VMs preemptíveis e padrão, o FlexRS ajuda a garantir que o seu pipeline progride mesmo que o Compute Engine preemptive as VMs preemptíveis.

Evite executar tarefas muito pequenas

Quando possível, evite executar tarefas que processem quantidades muito pequenas de dados. Se possível, execute menos tarefas em conjuntos de dados maiores. O início e a paragem de VMs de trabalho incorrem num custo, pelo que a execução de menos tarefas com mais dados pode melhorar a eficiência.

Certifique-se de que o Dataflow Shuffle está ativado. As tarefas em lote usam o Dataflow Shuffle por predefinição.

Ajuste as definições de dimensionamento automático

Por predefinição, as tarefas em lote usam o dimensionamento automático. Para algumas tarefas, como tarefas de curta duração, não é necessário o ajuste de escala automático. Se considerar que a sua pipeline não beneficia da escalabilidade automática, desative-a. Para mais informações, consulte Escalabilidade automática horizontal.

Também pode usar a escalabilidade dinâmica de threads para permitir que o Dataflow ajuste a contagem de threads com base na utilização da CPU. Em alternativa, se souber o número ideal de threads para a tarefa, defina explicitamente o número de threads por trabalhador através da numberOfWorkerHarnessThreads ou da number_of_worker_harness_threads opção de pipeline.

Interrompa trabalhos de longa duração

Defina as tarefas para pararem automaticamente se excederem um tempo de execução predeterminado. Se souber aproximadamente quanto tempo a tarefa demora a ser executada, use a max_workflow_runtime_walltime_seconds opção de serviço para parar automaticamente a tarefa se for executada durante mais tempo do que o esperado.

Otimize as definições para trabalhos de streaming

Esta secção apresenta sugestões para otimizar as definições de tempo de execução para tarefas de streaming.

Use o Streaming Engine

O Streaming Engine move a execução do pipeline das VMs de trabalho para o back-end do serviço Dataflow para uma maior eficiência. Recomendamos que use o Streaming Engine para as suas tarefas de streaming.

Considere o modo "pelo menos uma vez"

O Dataflow suporta dois modos para tarefas de streaming: modo exatamente uma vez e modo pelo menos uma vez. Se a sua carga de trabalho tolerar registos duplicados, o modo "pelo menos uma vez" pode reduzir significativamente o custo do seu trabalho. Antes de ativar o modo "pelo menos uma vez", avalie se o seu pipeline requer o processamento exatamente uma vez dos registos. Para mais informações, consulte o artigo Defina o modo de streaming do pipeline.

Escolha o seu modelo de preços

Os descontos de fidelidade (CUDs) para tarefas de streaming do Dataflow oferecem preços com desconto em troca do seu compromisso de usar continuamente uma determinada quantidade de recursos de computação do Dataflow durante um ano ou mais. Os CUDs do Dataflow são úteis quando os seus gastos na capacidade de computação do Dataflow para tarefas de streaming envolvem um mínimo previsível ao qual pode comprometer-se durante, pelo menos, um ano. Ao usar CUDs, pode reduzir potencialmente o custo das suas tarefas do Dataflow.

Considere também usar a faturação baseada em recursos. Com a faturação baseada em recursos, os recursos do Streaming Engine consumidos pela sua tarefa são medidos e contabilizados em unidades de computação do Streaming Engine. A faturação é feita com base na CPU do trabalhador, na memória do trabalhador e nas unidades de computação do Streaming Engine.

Ajuste as definições de dimensionamento automático

Use sugestões de dimensionamento automático para otimizar as definições de dimensionamento automático. Para mais informações, consulte o artigo Ajuste a escalabilidade automática horizontal para pipelines de streaming. Para tarefas de streaming que usam o Streaming Engine, pode atualizar as definições de ajuste automático sem parar nem substituir a tarefa. Para mais informações, consulte o artigo Atualização da opção de tarefa em curso.

Se considerar que a sua pipeline não beneficia do dimensionamento automático, desative-o. Para mais informações, consulte o dimensionamento automático horizontal.

Se souber o número ideal de threads para a tarefa, defina explicitamente o número de threads por trabalhador através da numberOfWorkerHarnessThreads ou da number_of_worker_harness_threads opção de pipeline.

Interrompa trabalhos de longa duração

Para tarefas de streaming, o Dataflow tenta novamente os itens de trabalho com falhas indefinidamente. O trabalho não é terminado. No entanto, a tarefa pode ficar bloqueada até o problema ser resolvido. Crie políticas de monitorização para detetar sinais de um pipeline parado, como um aumento na latência do sistema e uma diminuição na atualidade dos dados. Implemente o registo 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 seguintes fatores podem afetar o desempenho do pipeline:

  • O paralelismo disponível para o seu trabalho
  • A eficiência das transformações, dos conetores de E/S e dos codificadores usados no pipeline
  • A localização dos dados

O primeiro passo para melhorar o desempenho do pipeline é compreender o modelo de processamento:

  • Saiba mais sobre o modelo do Apache Beam e o modelo de execução do Apache Beam.
  • Saiba mais acerca do ciclo de vida do pipeline, incluindo a forma como o Dataflow gere a paralelização e as estratégias de otimização que usa. As tarefas do Dataflow usam várias VMs de trabalho, e cada trabalho executa várias threads. Os conjuntos de elementos de um PCollection são distribuídos a cada thread de trabalho.

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

Registo

Siga estas práticas recomendadas ao registar:

Testes

Testar o pipeline tem muitas vantagens, incluindo ajudar com as atualizações do SDK, a refatoração do pipeline e as revisões de código. Muitas otimizações, como a reformulação de transformações personalizadas com utilização intensiva da CPU, podem ser testadas localmente sem ter de executar uma tarefa no Dataflow.

Teste pipelines de grande escala com dados de teste realistas para a 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 dos elementos e o número de chaves. Teste os pipelines em dois modos: num estado estável e processando um grande atraso para simular uma recuperação de falhas.

Para mais informações sobre como criar testes unitários, testes de integração e testes completos, consulte o artigo Teste o seu pipeline. Para ver exemplos de testes, consulte o dataflow-ordered-processing repositório do GitHub.

O que se segue?