dbt: tags + fenêtres d’exécution

🔍 Contexte général

Tu as un data warehouse partagé (par exemple Snowflake ou BigQuery) et plusieurs équipes (produit, finance, marketing) y font tourner des modèles dbt.

Certaines transformations (modèles dbt) sont très lourdes (jointures de millions de lignes, agrégations complexes), d’autres sont légères (filtres simples, chargement de petites tables).

Si tout le monde exécute ses pipelines en même temps, les ressources du warehouse peuvent être saturées → ralentissements, échecs, coûts élevés.


🧩 Solution proposée : tags + fenêtres d’exécution

1. 📌 Taguer les modèles selon leur intensité

Tu ajoutes des tags dans tes modèles dbt pour identifier leur coût en ressources :

-- models/agg_user_metrics.sql
{{ config(materialized='table', tags=['resource_heavy']) }}
SELECT ...
-- models/load_countries.sql
{{ config(materialized='view', tags=['resource_light']) }}
SELECT ...

2. ⏰ Définir des fenêtres d’exécution selon les tags

Tu définis un planning pour exécuter chaque catégorie de modèles à un moment précis :

TagCréneau horaire autoriséRaisons
resource_light5h à 7h (début de journée)Pas coûteux, ne bloque pas les autres
resource_heavy2h à 4h du matinPériode creuse, disponibilité maximale des ressources
marketing8h à 10hPour que les dashboards soient prêts à 10h

3. ⚙️ Orchestration avec dbt Cloud ou Airflow

➤ En dbt Cloud, tu crées plusieurs jobs :

job: Run heavy models
schedule: Tous les jours à 2h00
command: dbt run --select tag:resource_heavy
job: Run light models
schedule: Tous les jours à 5h00
command: dbt run --select tag:resource_light

➤ En Airflow :

BashOperator(
    task_id='run_heavy_jobs',
    bash_command='dbt run --select tag:resource_heavy',
    execution_timeout=timedelta(hours=2),
    start_date=2AM
)

✅ Avantages concrets

Problème évitéGrâce à…
Contention de ressources (CPU, slots)Planification séparée des jobs gourmands
Coût imprévu dans Snowflake/BigQueryUsage plus maîtrisé pendant heures creuses
Ralentissement des dashboards métiersJobs marketing exécutés en avance ciblée
Blocage entre équipesCoordination par tag et par fenêtre horaire

🎯 Exemple dans une entreprise

Imagine que tu bosses chez “DataCorp” avec 3 équipes :

  • Produit : agrégation des événements utilisateurs (lourds)
  • Finance : calcul des KPI financiers journaliers (modéré)
  • Marketing : mise à jour des campagnes (léger)

Tu peux organiser tes exécutions comme suit :

HeureAction
02h00dbt run --select tag:resource_heavy
04h30dbt run --select tag:finance
06h30dbt run --select tag:marketing

💡 Exemple 2 d’utilisation :

Tu as 3 modèles dbt :

version: 2

models:
  - name: agg_user_metrics
    tags: ["heavy"]
  - name: product_snapshot
    tags: ["light"]
  - name: enrich_sales
    tags: ["heavy"]

Et dans ta pipeline, tu peux orchestrer comme ceci :

# Dans un cron / Airflow / dbt Cloud
# À 1h du matin :
dbt run --select tag:heavy

# À 6h du matin :
dbt run --select tag:light

🔚 Résumé

La stratégie tags + execution windows dans dbt te permet de :

  • maîtriser le moment où chaque modèle s’exécute
  • éviter les conflits de ressources
  • respecter les priorités métiers
  • partager efficacement un data warehouse