Ce site stocke des cookies sur votre ordinateur. Nous les utilisons afin de personnaliser votre expérience de navigation ainsi que pour des analyses d'audience.
Merci à Jonathan Trajkovic pour cette analyse. Nos pensées vont vers toutes celles et tous ceux touchés de près ou de loin par cette tragédie.
EDIT 18/11/2015 : Jonathan Trajkovic explique ses choix concernant cette data-visualisation.
Why this data-visualisation ?
I did this data-visualisation because I was really moved by all these attacks. Victims were in my age group… I live in Paris Xe so it was in my neighbourhood… I love going to concerts, drinking a beer with friends… being alive finally ! It was a way for me to pay tribute to victims. Why these data?
I chose to use aggregated data because I did not have so much time. But I was really interested by row data with geolocations, users… I was also interested by retweets and bookmarks. In fact I would have loved to have each tweet… But as I told before, I did not have so much time. Why did I choose a red color palette for all the story?
It was difficult for me to choose a design. I tried different palettes but none was good enough. When I tried the red palette, I told myself « Wow ! This is really agressive ! » and I thought about it a long time. I chose to use this even if it is agressive because, indeed, #ParisAttacks were really agressive… When my colleagues and friends looked at my visualization, they told me that there is too much red and it is agressive. I told them that it is the aim of red palette. I want readers to have the same feeling than me about #ParisAttacks. Apparently, it is working… Why did I choose a story?
First I tried to do the visualisation in a one page presentation. But when I looked at the data and how hashtags move, I told myself a story could be a good solution. So I put annotations, corresponding to events Firday night, to comment hashtags’ variations.
Cliquer sur l’image pour voir la dataviz sur le blog Tips & Viz
Jonathan Trajkovic est LE spécialiste de la pétanque au sein de la #SynalTeam. Ce chimiste de formation est aussi un grand amoureux de la musique folklorique morvandelle et un peu de Tableau (Zen Master 2015/2016).
Dans cet article nous allons illustrer la construction de couches sémantiques dans Dremio et montrer des exemples d’utilisation de certaines fonctionnalités qu’offre dbt : les tests, l’utilisation de code jinja et les macros.
Dremio cloud ou Dremio Software (version 22.0 ou supérieures).
dbt-dremio installé (assurez-vous que Python 3.8.x ou une version ultérieure est installée, ainsi que git).
Avoir une connaissance basique du langage sql (ainsi que les CTE).
Compétences basiques dans l’utilisation de la ligne de commande.
Dans la suite, VisualStudio code sera utilisé pour éditer les fichiers du projet. Vous pouvez utiliser un autre IDE ou l’éditeur de fichier de votre choix.
Dans cet article nous travaillerons sur un environnement linux (ubuntu) avec Dremio software connecté à une base de données postgres (BDLearn) où le jeux de données est disponible ici.
Présentation de l’exercice
L’objectif de cet article est d’illustrer comment utiliser dbt pour construire des couches sémantiques de données dans Dremio. Nous le ferons avec l’exemple suivant.
Le jeu de données représente la location de dvd dans des magasins, il contient des informations sur les films, les magasins de location et les locations, ainsi que les clients et le personnel des magasins. Pour l’exercice nous nous concentrerons sur le prêt de film et nous allons construire nos couches de données afin de répondre aux questions suivantes (nous ne nous intéresserons pas aux clients, aux magasins ou aux personnels).
Quels sont les films les plus regardés ? Lesquels génèrent le plus de bénéfices et à quelle catégorie appartiennent-il ? Quels sont les films peu ou pas empruntés ?
Parmi les films les plus empruntés, quelle est la durée des films ? Est elle similaire ?
Combien de films il y a par catégorie ? Quel genre de film est le plus emprunté ? Quelle catégorie de film génère le plus de bénéfices ?
Combien est ce qu’il y a de langue de film dans l’inventaire ? Les films dans quelle langue sont les plus empruntés ?
Pour cela nous nous intéresserons aux tables suivantes de la base de données :
Construction des couches sémantiques dans Dremio
Lors de l’initialisation d’un projet dbt, nous avons l’arborescence du projet ci-contre (voir l’article précédent initialiser un projet).
Nous nous intéresserons dans la suite, uniquement au dossier models/, tests/, macros/, dbt_packages/ et au fichier dbt_project.yml du projet dbt.
Commençons l’exercice par créer l’arborescence et la configuration des modèles.
Arborescence et configuration
Construisons nos couches de données dans Dremio comme suit :
une 1ère couche (bronze) qui sera le reflet des tables de la base de données qui nous intéresse.
une 2ème couche (silver) où nous allons regrouper les tables selon leur catégorie. Nous aurons deux vues, l’une concernant les films et l’autre concernant leur emprunt.
une 3ème couche applicative (gold), où nous aurons une vue qui englobera toutes les informations permettant de répondre à nos questions pour l’analyse.
Sous le répertoiremodèle nous allons créer une arborescencesimilaire à celle que l’on souhaite avoir dans Dremio pour faciliter l’écriture de la configuration et l’organisation du projet.
Et dans le fichier dbt_project.yml nous allons écrire la configuration de nos modèles. Tous nos modèles seront matérialisés en vue et seront créés dans le même space Dremio ‘dbt_learn’. De plus, dans le space ‘dbt_learn’ on va créer un répertoire par couche de données (bronze, silver et gold). Dans le répertoire bronze on placera tous les modèles du répertoire models/dbt_learn/0_bronze du projet, dans silver ceux du répertoire models/dbt_learn/1_silveret dans gold ceux du répertoire models/dbt_learn/2_gold.
Construisons maintenant les modèles couche par couche.
La couche bronze
Dans le répertoire 0_bronze/ ajoutons 7 modèles (fichiers .sql) et un fichier bronze_config.yml pour leur configuration et les tests (que l’on verra plus tard).
Définissons les modèles comme le reflet des tables du modèle de données présenté précédemment. Par exemple pour la table category on écrira la requête suivante :
Pour référencer les tables physiques dans Dremio on va utiliser le bloc de code source{{source()}} au lieu de référencer la table directement comme nous l’aurions fait dans Dremio. C’est une bonne pratique de l’utiliser car de cette façon, si un changement survient dans la base de données il n’y aura plus besoin de venir dans chaque modèle pour modifier la référence de la table, mais juste dans le fichier .yml où sa définition aura été notée. De plus, pour la documentation du projet ça permettra de connaître les sources qui ont permis de construire les modèles. Nous ne verrons pas la partie documentation que pourvoit dbt dans cet article mais dbt fournit un lineage qui est généré à partir de la définition de nos modèles grâce aux bloc {{source()}} et {{ref()}} (que nous verrons dans la partie suivante).
Sous le répertoire models/dbt_learn/ on va créer un fichier source.yml avec le contenu suivant :
Les références entre Dremio et dbt sont expliquées dans le schéma suivant :
Les modèles de la couche bronze sont maintenant prêts.
La couche silver
Au-dessus des modèles de la couche bronze nous allons construire deux modèles sous le répertoire /1_silver.
Pour lier ces modèles aux modèles le la couche bronze on va utiliser le bloc de code {{ref()}}. Définissons les modèles comme suit.
La couche gold
Enfin, au-dessus de la couche silver on va créer un modèle en vue de répondre à notre analyse. Ajoutons un fichier .sql sous le répertoire /2_gold.
Définissons le modèle comme suit.
Création dans Dremio
Actuellement, nous n’avons rien dans Dremio à part la connexion à la base de données.
Ajoutons nos couches sémantiques définies avec dbt dans Dremio en exécutant la commande suivante :
dbt run --select models/dbt_learn # tous les modèles present dans le répertoire models/dbt_learn
ou
dbt run --select +rented_film # le model rented_film et tous les modèles parents
Nos 10 vues ont bien été créées dans Dremio et le spaceainsi que les répertoires se sont créés :
On observe dans les logs d’exécution que les modèles se construisent dans l’ordre des couches, c’est grâce aux références entre les modèles.
Les données sont maintenant prêtes à être exploitées pour l’analyse.
Exemple d’utilisation des tests, la qualité des données
dbt est très pratique pour exécuter un grand nombre de tests de qualité sur les données. Écrire des tests va permettre d’effectuer un contrôle sur les données manipulées, de s’assurer que les données sont conformes à ce qui est attendu (éviter les surprise après coût) et de vérifier la fraîcheur des données sources.
Il existe deux types de tests, les tests singuliers et les tests génériques. Les tests singuliers sont, comme son nom l’indique, des tests pour un modèle spécifique (ou groupe de modèles) que l’on écrit soit même. Et les tests génériques sont des tests réutilisables qui peuvent être appliqué à plusieurs modèles. Il y a des tests génériques intégrés (built-in ou pre-built generic tests), ce sont 4 tests prédéfinis que l’on peut utiliser directement sur un modèle, et les tests génériques personnalisés (custom generic tests) que l’on écrit soit même. Illustrons l’utilisation des tests avec nos modèles précédemment construits.
Les tests singuliers
Les tests personnalisés sont à définir dans le répertoire tests/, dans un fichier sql. Le test est conçu pour un modèle unique. La requête doit identifier les lignes où la condition n’est pas remplie.
En voici un exemple :
Dans l’exemple, on veut que la date à laquelle on empreinte le film (rental_date) soit antérieure à la date à laquelle on rend le film (return_date). La condition n’est donc pas remplie lorsque rental_date > return_date. La commande dbt test va permettre de lancer le test. Ici nous souhaitons uniquement lancer ce test, pour cela nous allons lancer la commande dbt test -s test_rental_check_date.
Le test est passé donc on a bien la date rental_date antérieur à la date return_date.
Ces tests sont à définir dans un fichier .yml dans le répertoire models/. Implémentons ces 4 tests pour le modèle film dans le fichier bronze_config.yml. Vérifions que la colonne film_id ne contient pas de valeur nulle et contient des valeurs uniques. Que les valeurs de la colonne language_id sont bien présentes dans la colonne language_id du modèle language et qu’elles sont non nulles (notion de clé étrangère). Et enfin que les valeurs de la colonne rating soit l’une des valeurs suivantes : R, PG-13, NC-17, PG ou G.
Exécutons les tests du modèle film avec la commande suivante : dbt test -s film
Les tests personnalisés :
Ces tests, une fois définis, peuvent être réutilisés pour plusieurs modèles. Ils sont créés avec du code Jinja dans un bloc test et placés dans le répertoire /macros ou vous pouvez créer un répertoire generic sous le répertoire tests/ et les y placer.
Ajoutons le test not_empty_string à la colonne name du modèle category. Et exécutons les tests du modèle category avec la commande dbt test -s category.
Nous ne le verrons pas dans cet article mais dbt offre la possibilité d’utiliser des packages. Les packages permettent par exemple d’importer des tests déjà implémentés par d’autres dans votre projet et de les utiliser comme les tests génériques. Cela permet de ne pas réinventer la roue.
Exemple d’utilisation de code jinja et des macros
Nous ne verrons pas en détail dans cet article la syntaxe et tout ce qu’offre le code jinja et les macros dans un projet dbt, mais nous allons présenter quelques exemples d’utilisation.
Du code jinja dans la définition d’un modèle
Dans le jeux de données il y a la présence de 6 tables “payment” pour les 6 premiers mois de 2020. Imaginons que l’on souhaite avoir une vue regroupant l’ensemble de ces tables, il faudrait faire l’union de toutes ces tables. En utilisant du code jinja on a la possibilité de faire une itération sur le nom des tables. Voici un exemple :
Du code jinja dans la définition d’un test singulier
Écrivons un test qui permet que les tables dans la source contiennent au moins un certain nombre de ligne. Ce test peut être utile par exemple si on est dans un environnement de recette et que l’on souhaite vérifier que le jeu de données qu’on test est suffisant.
Le test nous dit que 2 tables n’ont pas un nombre de lignes suffisant. Et effectivement la table category et language ne respecte pas les conditions.
Utilisation d’une macro dans la définition d’un modèle
Imaginons que dans plusieurs modèles nous ayons besoin de faire l’agrégation COUNT et SUM sur une colonne, comme nous l’avons fait pour le modèle de la couche gold. Nous pourrions écrire une macro qui ferait ces opérations et l’utiliser après dans ces modèles.
Dans le dossier macros/ on va ajouter un fichier “aggregate_calculation.sql”. Et dans ce fichier on va ajouter le code suivant :
Dans un même fichier il est possible de définir plusieurs macros.
Maintenant dans notre modèle rented_film, faisons référence à la macro que nous venons d’ajouter :
Conclusion
Dans cet article nous avons vu un exemple de comment créer des couches sémantiques dans Dremio avec dbt. Nous avons également vu comment utiliser les tests pour contrôler la qualité des données utilisées et comment utiliser du code jinja ou des macro dans la définition de nos modèles.
Dans un prochain article on illustrera d’autres fonctionnalités qu’offre dbt.
A la mi-avril 2025 la version 3.0 de ce projet va voir le jour. Elle apporte des améliorations significatives qui promettent de transformer l’expérience des utilisateurs et d’attirer de nouveaux adeptes.
Performance et architecture repensées
La nouvelle architecture client-serveur d’Airflow 3.0 offre une flexibilité et une scalabilité accrues. Cette refonte permet une exécution fluide sur différents environnements cloud et améliore considérablement les performances globales du système.
Le monitoring des DAGs a été optimisé, offrant une visibilité en temps réel sur l’état des workflows. Le découplage entre l’API et le frontend permet une meilleure réactivité de l’interface utilisateur et facilite les mises à jour indépendantes de ces composants.
La version 3 introduit le Edge Executor ! Il est ainsi possible d’avoir des déploiements très flexibles. L’exécution des tâches est réalisée au plus près des données.
Avec l’introduction des tâches différables, il est déjà possible d’exécuter des workflows asynchrones et de libérer le slot du worker Airflow. Certes, on peut utiliser l’opérateur SSH, mais Airflow ne prenait pas nativement en charge l’exécution de workers sur des machines distantes. Avec Airflow 3.0, tout cela change.
Les workers n’auront plus besoin d’être contenus dans le déploiement Airflow. Airflow fait référence aux workers externes sous le nom d’Edge executors. Cela signifie que plusieurs choses vont changer :
Les workers ne pourront plus accéder à la base de données Airflow. Par défaut, tous les services Airflow ont accès à la base de données Airflow car elle est responsable du suivi de l’état. En découplant les workers et la base de données Airflow, il devient possible d’exécuter des workers à distance. Ceci est principalement facilité par le nouveau Task SDK.
Les workers communiqueront via l’API REST d’Airflow. L’authentification des workers externes se fera par le biais de jetons JWT ou ID.
Les workers ne seront plus liés aux packages Airflow. Il n’y aura plus de dépendance aux packages installés dans l’image fournie avec le déploiement Airflow. Un package distinct sera disponible, beaucoup plus léger que l’image de base d’Airflow. Ce package fournira les outils nécessaires pour exécuter le worker externe.
Versionning des DAGs
Une fonctionnalité très attendue est le versionning natif des DAGs. Les utilisateurs peuvent désormais suivre l’historique des modifications de leurs workflows directement dans l’interface utilisateur. Cette fonction permet de visualiser les changements apportés aux DAGs au fil du temps et de revenir facilement à des versions antérieures si nécessaire.
Des Datasets aux Assets
Airflow 3.0 introduit le concept d’Assets, une évolution des Datasets. Cette approche offre une gestion plus fine des dépendances entre les tâches et les données.
De cette manière, la traçabilité entre jeu de données et traitements (tâche, DAG) est intrinsèque. Vous pourrez tout de suite identifier les jeux de données exploités par un DAG et tous les DAGs qui lisent ou écrivent tels ou tels jeux de données.
SDK multi-langages
Airflow 3.0 étend son support à plusieurs langages de programmation grâce à un nouveau SDK. Les langages de programmation supportés par le nouveau SDK : Python, Java (langages dérivé Scala…), Javascript, TypeScript, Go.
Par exemple, on peut maintenant écrire les DAG en Java.
L’interface utilisateur d’Airflow 3.0 a été entièrement repensée avec React et FastAPI. Elle offre une expérience plus intuitive et réactive, avec des fonctionnalités telles que :
Un mode sombre
Une vue en grille et une vue graphique des DAGs redimensionnables
Une visualisation améliorée des dépendances entre les assets
Un accès rapide aux informations clés sur le déploiement Airflow et l’état des services.
Tester Apache Airflow 3 par vous même
L’article a surtout vocation à vous rappeler que la version 3 est bientôt là. Bien sûr toutes les fonctionnalités de cette verion 3 n’ont pas été exhaustivement listées. Et nous vous invitons à le découvrir par vous même. Cette suite de commandes devrait vous aider.
git clone https://github.com/apache/airflow.gitcd airflow# Création et activation de l'environnement virtuel (recommandé)python3 -m venv .venvsource .venv/bin/activategit checkout v3-0-stablepip install "pipx>=1.4.1"pipx ensurepathpipx install -e./dev/breezebreeze start-airflow --backend postgres --load-example-dags --dev-mode --db-reset
Par la suite, ouvrez votre navigateur à la page suivante : http://127.0.0.1:28080.
La participation de tout un chacun est importante. Faites des retours à la communauté.
En attendant la mi-avril
Avec ces améliorations majeures, Apache Airflow 3.0 se positionne comme une solution d’orchestration de workflows encore plus puissant et accessible. Dans un contexte économique où la maîtrise du système d’information est cruciale, cette nouvelle version pourrait attirer de nombreux nouveaux utilisateurs en quête d’un outil flexible, performant et facile à utiliser pour gérer leurs pipelines de données et leurs processus métier. Les utilisateurs de Control-M seraient surpris de la facilité de migration vers Apache Airflow.
Toute l’équipe de Synaltic se tient disponible pour vous aider à découvrir et faire vos premiers pas avec Apache Airflow y compris avec cette nouvelle version.
À la fin de cette formation, vous serez en mesure de comprendre les concepts clés, les avantages et l’architecture de dbt en tant qu’outil de transformation et de modélisation des données. De plus vous pourrez mettre en place un projet utilisant dbt en partant de 0 et en appliquant les bonnes pratiques.
A propos de DBT
Data Build Tool (ou dbt) est un outil open source qui facilite la transformation de vos données au sein de votre Data Warehouse ou de votre Data Lakehouse comme Dremio, à travers le processus ELT (Extract Load Transform). L’outil utilise le langage sql pour la transformation des données avec la possibilité d’intégrer du code jinja dans les requêtes ou d’utiliser des macros pour par exemple réutiliser du code ou créer des fonctions. Vous pouvez utiliser git pour faciliter la collaboration et le versionning de votre projet dbt.
Sections commentaires non disponible.