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.