SELECTSELECT

SELECT

3 façons de configurer la taille des warehouses Snowflake dans dbt

By Niall WoodwardJan 17, 20235 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

Utiliser des tailles de warehouse différentes selon les workloads Snowflake apporte un vrai gain de performance et d'optimisation des coûts. dbt s'intègre nativement à Snowflake et permet de choisir un warehouse spécifique jusqu'au niveau du modèle. Dans cet article, nous détaillons l'usage de cette fonctionnalité et partageons quelques bonnes pratiques. Pourquoi changer la taille du warehouse ?

Si votre projet dbt met de plus en plus de temps à s'exécuter, provoque des dépassements de SLA ou dégrade l'expérience utilisateur, augmenter la taille du warehouse permettra sans doute de l'accélérer. Et si vous avez déjà augmenté la taille par défaut du warehouse de dbt, vous cherchez peut-être à réduire les coûts en n'augmentant la taille que pour les modèles qui en tirent vraiment parti.

Accélérer les modèles dbt

Les modèles deviennent souvent plus lents à mesure que le volume de données grandit. Pour certains, ce ralentissement est linéaire ; pour d'autres, ce n'est pas le cas : les fonctions d'agrégation et les jointures peuvent devenir exponentiellement gourmandes en calcul à mesure que les volumes augmentent. Tout cela peut peser lourdement sur le temps d'exécution, surtout lorsqu'un modèle commence à déborder sur le stockage distant (consultez notre article sur le query profile pour en savoir plus).

Le moyen le plus efficace d'accélérer une requête reste de réduire le volume de données qu'elle traite. Si un modèle ralentit et repose sur une matérialisation de type table, envisagez de passer à une matérialisation incrémentale pour ne traiter que les données nouvelles ou modifiées à chaque exécution.

Si vous utilisez déjà l'incrémental, ou si ce n'est pas envisageable, augmenter la taille du warehouse est sans doute la prochaine étape la plus efficace.

Configurer le warehouse Snowflake par défaut de dbt

Par défaut, dbt utilise le warehouse Snowflake défini dans l'entrée profiles.yml du projet, ou, à défaut, le warehouse par défaut de l'utilisateur Snowflake de dbt. En le remplaçant par un autre warehouse plus grand, ou en redimensionnant simplement le warehouse existant, dbt exécutera désormais toutes ses requêtes sur un warehouse plus puissant. Selon le contexte d'exécution, le warehouse peut être modifié dans le fichier profiles.yml, ou dans dbt Cloud au niveau de l'environnement.

profiles.yml

Dans votre fichier profiles.yml, modifiez le paramètre warehouse pour pointer vers un autre virtual warehouse. La taille de chaque warehouse se configure dans 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

Dans dbt Cloud, rendez-vous dans Deploy > Environments depuis la barre de menu supérieure. Sélectionnez l'environnement à modifier, puis Settings. Cliquez sur Edit, puis faites défiler jusqu'à Deployment Connection pour changer le warehouse. Sa taille se configure dans Snowflake.

Modifier la taille du warehouse dbt par défaut n'est toutefois pas forcément judicieux : la plupart des requêtes du projet ne tireront pas profit de cette augmentation, ce qui se traduira par une hausse des coûts Snowflake. Pour mieux comprendre l'impact de la taille du warehouse sur la vitesse des requêtes, consultez notre article sur le dimensionnement des warehouses. Plutôt que d'augmenter la taille par défaut, nous recommandons de la fixer à X-Small et de surcharger la taille au niveau de chaque modèle selon les besoins.

Configurer la taille du warehouse Snowflake d'un modèle dbt

Configurer le warehouse au niveau du modèle permet de choisir la taille adaptée aux besoins de chaque modèle, et donc d'optimiser à la fois la performance et le coût.

Warehouse codé en dur

dbt propose la configuration de modèle snowflake_warehouse, qui se présente ainsi dans un modèle donné :

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

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

Cette configuration peut également s'appliquer à tous les modèles d'un répertoire via dbt_project.yml, par exemple :

name: my_project
version: 1.0.0

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

Nom de warehouse dynamique selon l'environnement

Dans bien des cas, le warehouse utilisé en production diffère de celui qu'on utilise en développement, en CI ou dans un workflow de tests automatisés. Il en va de même pour les warehouses que nous configurons désormais au niveau du modèle. Pour cela, on peut utiliser une macro à la place de la valeur littérale vue précédemment :

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

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

Cette macro peut intégrer une logique qui renvoie la taille de warehouse souhaitée selon l'environnement.

Imaginons qu'en production nous ayons créé des warehouses nommés dbt_production_<size> (dbt_production_xsmall, dbt_production_small, dbt_production_medium, etc.), et qu'en CI nous disposions de warehouses nommés dbt_ci_<size>. Pour le développement local, nous voulons simplement utiliser le warehouse par défaut et ignorer la taille configurée. Nous voulons aussi lever une erreur si la taille choisie ne figure pas dans une liste gérée. Voici la logique de macro correspondante :

{% 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 %}

L'utilisation d'une macro pour la configuration snowflake_warehouse ne fonctionne que dans les fichiers de modèle ; elle n'est pas utilisable dans dbt_project.yml.

Configurer le warehouse pour d'autres ressources dans dbt

Il n'est aujourd'hui possible de configurer des warehouses que pour les modèles et les snapshots. Pour suivre l'évolution de la prise en charge d'autres ressources comme les tests, jetez un œil à cette issue GitHub.

Suivre les performances et le coût des modèles dbt

Découvrez notre package dbt dbt_snowflake_monitoring, qui fournit un modèle dbt_queries simple d'utilisation pour analyser les performances des modèles dbt dans le temps. Il attribue les coûts à chaque exécution de modèle, ce qui permet de répondre facilement à des questions comme quels sont les 10 modèles les plus coûteux du mois dernier ?.

Merci de votre lecture ! Dans un prochain article, nous partagerons d'autres recommandations pour optimiser les performances de dbt sur Snowflake. Abonnez-vous pour être informé des prochaines publications, et n'hésitez pas à nous contacter si vous avez des questions !

Niall Woodward·Co-fondateur et CTO de SELECT

Niall est co-fondateur et CTO de SELECT, une plateforme SaaS de gestion et d'optimisation des coûts Snowflake. Avant de lancer SELECT, Niall était data engineer chez Brooklyn Data Company et dans plusieurs startups. Passionné d'open source, il est également mainteneur de SQLFluff et créateur de trois packages dbt : dbt_artifacts, dbt_snowflake_monitoring et dbt_query_tags.