SELECTSELECT

SELECT

3 formas de configurar tamanhos de warehouse Snowflake no dbt

By Niall WoodwardJan 17, 20235 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Usar tamanhos diferentes de warehouse para workloads distintos no Snowflake traz enorme ganho de performance e otimização de custos. O dbt se integra nativamente ao Snowflake e permite escolher warehouses específicos até no nível do modelo. Neste post, mostramos exatamente como usar esse recurso e compartilhamos algumas boas práticas. Por que mudar o tamanho do warehouse?

Se o seu projeto dbt começou a demorar demais para rodar, estourando SLAs ou prejudicando a experiência do usuário, aumentar o tamanho do warehouse provavelmente vai melhorar a velocidade. Por outro lado, se você já aumentou o tamanho padrão do warehouse do dbt, talvez seja hora de reduzir custos aumentando o tamanho apenas dos modelos que realmente se beneficiam disso.

Acelere modelos dbt

É comum que modelos demorem mais conforme o volume de dados cresce com o tempo. Em alguns modelos, essa desaceleração é linear em relação ao volume de dados. Em outros, nem sempre, porque funções de agregação e joins podem ficar exponencialmente mais pesados em computação à medida que o volume cresce. Todos esses efeitos podem impactar o tempo de execução de forma significativa, especialmente se um modelo começar a fazer spilling para armazenamento remoto (veja nosso post sobre query profile para entender melhor).

A forma mais eficaz de acelerar qualquer query é reduzir o volume de dados que ela processa. Se um modelo está ficando lento e usa materialização do tipo table, considere migrar para uma materialização incremental para processar apenas dados novos ou atualizados a cada execução.

Se você já usa incrementalização, ou se ela não é viável, então aumentar o tamanho do warehouse costuma ser o próximo passo para acelerar o modelo.

Configurando o warehouse Snowflake padrão do dbt

Por padrão, o dbt usa o warehouse Snowflake configurado na entrada do projeto no profiles.yml ou, se não houver, o warehouse padrão do usuário Snowflake do dbt. Trocando esse warehouse por outro maior, ou simplesmente redimensionando o existente, o dbt passa a executar todas as queries em um warehouse maior. Dependendo de onde o dbt roda, o warehouse pode ser alterado no arquivo profiles.yml ou no dbt Cloud, no nível do ambiente.

profiles.yml

No seu arquivo profiles.yml, edite a configuração warehouse para apontar para um virtual warehouse diferente. O tamanho de cada warehouse é configurado no Snowflake.

select_internal:
  outputs:
    dev:
      type: snowflake
      account: org.account
      user: niall
      password: XXXXX
      warehouse: dev
      database: dev
      schema: niall
      threads: 8
  target: dev

dbt Cloud

No dbt Cloud, vá em Deploy > Environments no menu superior. Escolha o ambiente que quer editar e clique em Settings. Clique em Edit e role até Deployment Connection, onde dá para mudar o warehouse. O tamanho do warehouse é configurado no Snowflake.

Mudar o tamanho padrão do warehouse do dbt nem sempre é a melhor escolha, já que a maior parte das queries do projeto não vai se beneficiar do warehouse maior, gerando aumento nos custos do Snowflake. Para mais detalhes sobre o impacto do tamanho do warehouse na velocidade das queries, veja nosso post sobre dimensionamento de warehouse. Em vez de aumentar o tamanho padrão, recomendamos manter o warehouse padrão como X-Small e sobrescrever o tamanho no nível de cada modelo quando necessário.

Configurando o tamanho do warehouse Snowflake de um modelo dbt

Configurar o warehouse no nível do modelo significa que dá para escolher tamanhos específicos de warehouse de acordo com o que cada modelo precisa, otimizando performance e custo.

Warehouse fixo no código

O dbt oferece a configuração de modelo snowflake_warehouse, que fica assim quando definida em um modelo específico:

{{ config(
    snowflake_warehouse="dbt_large"
) }}

select
    ...
from {{ ref('stg_orders') }}

Outra opção é aplicar a configuração a todos os modelos de um diretório pelo dbt_project.yml, assim:

name: my_project
version: 1.0.0

---
models:
  +snowflake_warehouse: 'dbt_xsmall'
  my_project:
    clickstream:
      +snowflake_warehouse: 'dbt_large'

Nome de warehouse dinâmico de acordo com o ambiente

Em muitos casos, o warehouse que queremos usar em produção é diferente do que usaríamos em desenvolvimento ou em um workflow de CI ou de testes automatizados. O mesmo vale para os warehouses que estamos configurando agora para modelos individuais. Para isso, podemos usar uma macro no lugar do valor literal do warehouse:

{{ config(
    snowflake_warehouse=get_warehouse('large')
) }}

select
    ...
from {{ ref('stg_orders') }}

Essa macro pode implementar a lógica para devolver o tamanho de warehouse desejado em cada ambiente.

Suponha que em produção criamos warehouses chamados dbt_production_<size> (dbt_production_xsmall, dbt_production_small, dbt_production_medium etc.) e, para CI, warehouses chamados dbt_ci_<size>. Em desenvolvimento local, queremos só usar o warehouse padrão e ignorar totalmente o tamanho configurado. Também queremos disparar um erro se o tamanho escolhido não estiver em uma lista gerenciada. Dá para fazer isso com a seguinte lógica de macro:

{% macro get_warehouse(size) %}
    {% set available_sizes = ['xsmall', 'small', 'medium', 'large', 'xlarge', '2xlarge'] %}
    {% if size not in available_sizes %}
        {{ exceptions.raise_compiler_error("Warehouse size not one of " ~ valid_warehouse_sizes) }}
    {% endif %}
    {% if target.name in ('production', 'prod') %}
        {% do return('dbt_production_' ~ size) %}
    {% elif target.name in ('ci') %}
        {% do return('dbt_ci_' ~ size) %}
    {% else %}
        {% do return(None) %}
    {% endif %}
{% endmacro %}

Usar uma macro na configuração snowflake_warehouse só funciona em arquivos de modelo e não pode ser feito no dbt_project.yml.

Configurando o warehouse para outros recursos no dbt

Hoje só é possível configurar warehouses para modelos e snapshots. Se você quer acompanhar o suporte a outros recursos, como testes, dê uma olhada nesta issue no GitHub.

Monitorando performance e custo dos modelos dbt

Confira o nosso pacote dbt dbt_snowflake_monitoring, que oferece um modelo dbt_queries fácil de usar para entender a performance dos modelos dbt ao longo do tempo. Ele atribui custos a execuções individuais dos modelos, o que facilita responder perguntas como "quais são os 10 modelos mais caros do último mês?".

Valeu pela leitura! Em um próximo post, vamos compartilhar mais recomendações para otimizar a performance do dbt no Snowflake. Inscreva-se para receber notificações dos próximos posts e fique à vontade para entrar em contato se tiver qualquer dúvida!

Niall Woodward·Co-founder & CTO da SELECT

Niall é Co-Founder e CTO da SELECT, uma plataforma SaaS de gestão e otimização de custos do Snowflake. Antes de fundar a SELECT, Niall foi data engineer na Brooklyn Data Company e em várias startups. Entusiasta de open source, ele também é mantenedor do SQLFluff e criador de três pacotes dbt: dbt_artifacts, dbt_snowflake_monitoring e dbt_query_tags.