DuckDB, un SGBD qui en bouche un coin

Suite à ce magnifique jeu de mot sur le bruit de nos amis palmipèdes, laissez-moi vous parler un peu de DuckDB. Il s’agit d’un outil de base de données analytiques open source avec un traitement des données en format colonne qui se veut portable, simple et performant tout en étant gratuit.

Cet outil a eu droit à une conférence en février, la DuckCon, présentant ses divers aspects et quelques nouveautés à venir dans la prochaine version. La technologie étant quelque peu méconnue, j’ai trouvé l’occasion idéale pour en faire une présentation.

Sans plus attendre, passons d’abord à une petite description de DuckDB pour le découvrir avant d’entrer plus en détail dans ce qui a été dit lors de cette conférence.

Présentation

DuckDB est ce qu’on appelle communément un SGBD (Système de Gestion de Base de Données) OLAP (OnLine Analytical Processing), dont la particularité est l’architecture basée sur une structuration en colonnes plutôt qu’en lignes. Il est conçu pour le traitement et le stockage de données tabulaires en mémoire et faire des analyses en SQL simplement, rapidement, sur un large éventail de systèmes et/ou d’architectures. Dans ce sens, il est similaire à un autre outil moins récent, SQLite, dont l’équipe derrière DuckDB s’est inspirée pour sa simplicité et son fonctionnement intégré. Les maîtres mots à retenir sont les suivants :

Simplicité : DuckDB se veut très facile d’utilisation et d’installation avec son fonctionnement intégré sans dépendances externes ni pour la compilation, ni pour l'exécution. L’outil est autonome et permet même dans certains cas de traiter des données sans les copier.

Portabilité : DuckDB est compatible avec un grand nombre de systèmes d'exploitations (Windows, macOS, Linux) et d’architectures CPU. Il dispose également d’API pour différents langages comme Java, C++, Python pour ne citer qu’eux. Il y a même une interface web nommée DuckDB Wasm disponible ici. Avis aux curieux donc pour un aperçu et une prise en main rapide sans prérequis.

Performance : DuckDB a été conçu pour le traitement analytique en ligne, d’où sa structure en colonnes plutôt qu’en lignes. Cette architecture est couplée à un moteur d'exécution de requêtes vectorisées qui interprète chaque opération par lots et optimise l’utilisation du CPU. D’après un benchmark réalisé par l’équipe, DuckDB a été 40 fois plus rapide que PostgreSQL pour la même requête, et 5 à 10 fois plus rapide que SQLite.

Polyvalent : DuckDB dispose d’une prise en charge étendue de SQL, avec son lot de fonctionnalités et de librairies, comme on peut s’y attendre pour un SGBD actuel. Les données sont stockées dans un seul fichier persistant intégrable dans les pipelines de données (avec une intégration plus poussée dans R et python actuellement).

Libre : DuckDB est publié sous la licence du MIT, qui donne un droit illimité à la réutilisation, modification, réplication entre autres du logiciel. Le code est donc open source et disponible sur GitHub. Avec actuellement plus de 15000 étoiles, le code semble bénéficier d’une belle communauté ce qui est toujours un plus pour collaborer et trouver des ressources.

Voici donc pour les qualités qui se dégagent de DuckDB. Bien sûr, cette description n’a pour vocation qu’une présentation minimale de toutes les caractéristiques de la technologie pour se faire une idée globale. Heureusement pour les curieux qui souhaitent creuser un peu plus, la documentation est disponible directement sur le site.

DuckCon #4 à Amsterdam

La DuckCon est la conférence annuelle pour toutes les personnes intéressées par la technologie éponyme de l'événement. Pour sa 4ème édition, elle a eu lieu le 2 février 2024 à Amsterdam, lieu de naissance de DuckDB. Elle était assez courte étant donné la jeunesse du SGBD, ce qui ne l’a pas empêché de présenter plusieurs talks intéressants. Tout le programme et les intervenants peuvent être retrouvés sur cette page, avec des liens youtubes et pdf disponibles pour plus de détails. Passons maintenant à une synthèse des différents sujets abordés.

State of the duck

La conférence commence par une introduction des deux créateurs de DuckDb, qui présentent en chiffres, graphiques et images l’adoption de leur SGBD par les utilisateurs. Ils affichent non sans émotion leur deux millions de téléchargements par mois, et le nombre de personnes les suivant sur les réseaux sociaux (LinkedIn, Twitter et Discord). On y constate également un intérêt grandissant sur google trend depuis janvier 2022, ainsi qu’une courbe à l’allure exponentielle de l’évolution du nombre d’étoiles github (plus de 15 000 actuellement). Outre d’autres anecdotes, le fait marquant de l’année passée reste le lancement de leur site web avec 500 000 visiteurs par mois. Les deux créateurs passent ensuite sur ce qu’il y a à venir durant l’année.

Nouveautés

La première annonce des créateurs concerne la politique de support. Ils expliquent que la hausse d'utilisateurs implique une hausse des interrogations, ce qui cause un problème étant donné le manque de ressources de l’entreprise à l’heure actuelle. Il est cependant possible de souscrire à une offre premium pour un support privilégié. Il n’y a eu aucune information sur le prix cela dit, cela se fait via une demande personnalisée sur le site directement.

Vient ensuite la grosse annonce de cette conférence : la sortie de la version 1.0.0 de DuckDB d’ici juillet 2024. D’ici là, l’équipe se concentrera seulement sur des patchs mineurs de corrections de bugs, sans nouvelles fonctionnalités. L’idée est d’avoir lors de la sortie une version la plus stable et robuste possible qui ne causera aucune inquiétude aux utilisateurs. Le créateur assure également une garantie sur la rétrocompatibilité des fichiers de base de données, pour qu’ils puissent vivre potentiellement indéfiniment. A noter que pour la postcompatibilité, elle ne sera pas encore garantie si l’on utilise de nouvelles fonctionnalités. L’ambition est de devenir un nouveau format standard de stockage de données.

La conférence enchaîne sur les détails techniques que le prochain patch, le 0.10.0, apportera lors de son déploiement. Il s’agit d’une mise à jour cruciale qui apportera la base de ce que sera la version 1.0.0. Sans trop rentrer dans les détails, voici  une synthèse des points de la version annoncés:

Stabilisation du format du fichier avec un début de rétrocompatibilité entre la version 0.10.0 et 0.9.2.0 et une postcompatibilité partielle.

Connexion à de multiples bases de données. DuckDB dispose d’une commande SQL ATTACH qui permet de plugger un autre base de données SQL ou DuckDB. Elles pourront ainsi être utilisées comme des tables classiques où l’on pourra exécuter toutes les opérations SQL. Cette fonctionnalité s’entend désormais à PostgreSQL et  à MySQL grâce à l’architecture permissive de l’outil.

ATTACH 'dbname=mypostgresdb' as mypostgresdb (TYPE postgres);
SELECT myfields FROM mypostgresdb.mytable;

Refonte de la lecture de CSV avec une nette amélioration des performances et corrections de bugs.

Graphique de comparaison de performance entre la version 0.9.2 et 0.10-dev issu de la présentation
Graphique de comparaison de performance entre la version 0.9.2 et 0.10-dev issu de la présentation

Un nouveau type : le fixed-length array. Un type de données bien connu qui consiste en une liste dont les entrées ont toutes la même taille. Ceci s’accompagne de nouvelles fonctions propres à ce nouveau type disponible sur la documentation.

CREATE TABLE myTable(myField DOUBLE[3]);
INSERT INTO myTable VALUES([1,2,3]);

Ajout d’un temporary memory manager. DuckDB supporte les opérations sur des tables dont la taille dépasse celle de la RAM. Autrement dit, les opérateurs gourmands en mémoire tels que les jointures ou les agrégations peuvent sous-traiter leur charge à l’aide de fichiers temporaires sur le disque. L’inconvénient est que, lors de requêtes complexes qui multiplient l’utilisation de ces opérateurs, ces derniers ne communiquent pas entre eux et ne savent pas ce que leurs congénères consomment en termes de mémoire, pouvant ainsi causer des erreurs. C’est là qu’intervient le temporary memory manager qui fonctionne comme un registre orchestrant ces opérations en optimisant l’allocation de la mémoire, ainsi que le traitement algorithmique de la requête.

Ajout d’un secret manager pour la gestion des identifiants de connexion à des services extérieurs. Ces identifiants sont stockés dans des objets SECRET, persistants ou non, et typés en fonction du service auquel on souhaite accéder (S3, Google Cloud Storage, Cloudflare R2 et Azure Blob Storage)

CREATE SECRET (
 TYPE S3,
 KEY_ID 'mykey',
 SECRET 'mysecret',
 REGION 'myregion',
);

Utilisation de la méthode de compression ALP (Adaptive Lossless Floating-Point) pour les nombres à virgule. Ce nouveau système remplace les deux anciens utilisés (Chimp/Patas) en faisant preuve d’une compression/décompression plus rapide et moins encombrante.

Graphique de comparaison de performance
Graphique de comparaison de performance de compression issu de la présentation

  • Améliorations du stockage.
  • Amélioration de l’interface de commande (CLI) avec le mode éditeur multi lignes qui devient le mode par défaut et une mise en évidence des erreurs de syntaxe plus claire.

Pour finir cette première session, le présentateur nous parle de ce à quoi l’on doit s’attendre pour la suite de l’évolution. Le premier axe concerne l’ajout d’extensions pour d’autres langages (Rust and GO par exemple, cités par le créateur) mais également l’intégration d’extensions créées par des contributeurs externes. Le deuxième axe concerne l’amélioration de l’optimisation globale de l’outil, où il y a encore beaucoup de choses qui peuvent être faites. Deux points sont évoqués pour le moment : le partition/sorting awareness et l’estimation des cardinalités pour optimiser le plan de requête. Enfin, le dernier axe concerne l’ajout de nouveaux formats de data lakehouse, où pour l’instant il n’existe que du support pour la lecture de Apache Iceberg.

Présentations des utilisateurs

Suite à la présentation des deux créateurs, la conférence enchaîne sur la deuxième partie. Celle-ci se compose de plusieurs présentations faites par des utilisateurs de DuckDB qui expriment un retour d’expérience sur la technologie. Ceci permet de s'en faire une meilleure idée au travers de quelques cas d’usage.

Fouille de données

La personne qui ouvre le bal est une ingénieure de l’entreprise Hugging Face, une start-up dans le domaine de l’intelligence artificielle. Elle propose, sur son site web, de nombreux modèles et datasets pour offrir un terrain de jeu de machine learning open source et collaboratif aux utilisateurs. Les datasets sont stockés et compressés sous le format parquet sur des dépôts git, et il leur fallait un moyen rapide et efficace pour simplement les parcourir, les filtrer ou créer des statistiques dessus. DuckDB leur a apporté une solution en fonctionnant comme un index sur chaque dépôt git : il intègre les fichiers parquet dans un fichier index.duckdb afin de pouvoir y exécuter les requêtes SQL. L’entreprise en tire une expérience très positive en soulignant la fiabilité de l’outil et la simplicité de la prise en main et de la mise en place.

Construire un datalake

Un ingénieur de Fivetran prend ensuite le relai. L’entreprise propose une plateforme qui permet l’extraction, le chargement et la transformation des données pour leur client, et ont décidé d’intégrer DuckDB dans leur architecture. Plus précisément, dans leur offre datalake, Fivetran utilise Duckdb pour écrire sur le serveur et effectuer les opérations de suppression, d’insertion et de mise à jour. Cette solution a permis le remplacement de leur propre code par une version plus simple nécessitant moins de maintenance. Encore une fois le présentateur souligne la simplicité et la performance de DuckDB, et conclut par le désir de l’entreprise d’étendre la technologie sur d’autres processus de leur plateforme.

Schéma issu de la présentation de Fivetran montrant leur logique d’utilisation de DuckDB
Schéma issu de la présentation de Fivetran montrant leur logique d’utilisation de DuckDB

Intégrité des données

Par la suite, un lead data architect de la société Prequel prend le micro. Il commence par résumer l’offre de l’entreprise : résoudre les problèmes de partage de données entre les plateformes Saas et leurs clients. Ils ont pour cela un planificateur qui gère les transferts de lots de données via des fichiers parquets, et qui a pour élément central DuckDB. L’outil a offert une solution au problème d’intégrité des données qui pouvait avoir lieu durant le transfert. En effet, vu la diversité des sources de données et des cibles, il se peut qu’il y ait des non-concordances entre les types (encodage des string, taille des nombres, format des dates… sans parler des types plus complexes comme les struct), lors de l’écriture du fichier parquet. Et c’est là que DuckDB démontre son efficacité grâce à sa bonne gestion de ce type de fichier et ses fonctionnalités intégrées. Il permet de gérer et modifier les fichiers aisément grâce à SQL.

Notebooks interactifs

Un software engineer de Datacamp, plateforme en ligne d’apprentissage des technologies de la data, explique à son tour son utilisation de DuckDB. La plateforme dispose d’un notebook interactif pour l’utilisateur afin qu’il puisse exécuter du code et des requêtes SQL. C’est là qu’intervient DuckDB qui se charge d’effectuer les requêtes sur les objets du code stockant les données. Il est aussi question pour Datacamp de l’utiliser dans le cadre des ses cours en SQL de par sa simplicité et ses performances.

Recherche d’informations

Profil un peu différent pour la suite puisqu’il s’agit d’un professeur d’université qui prend la parole. Il soulève des questions sur la recherche d’informations dans le numérique (applications, web, base de données…), et convient que la complexité augmente. Il parle  ensuite du projet Open WebSearch, un projet open source d’initiative européenne qui a pour ambition de créer son infrastructure de recherche web. Pour améliorer le processus de recherche, il apporte un schéma de solution qui suit le même principe que celle de Hugging Face, en utilisant un index DuckDB stockant des métadonnées telles que la catégorie, le langage… La prochaine étape est également d’utiliser un index inversé DuckDB en plus de celui des métadonnées. Il conclut ensuite sur son avis sur le futur des bases de données vectorielles.

Analyser une attaque DDos

On entre maintenant dans un thème plus lié à la sécurité avec l’analyse d’une attaque DDos. Un ingénieur de l’entreprise SURF nous explique la logique derrière son processus pour décortiquer les traces d’une attaque. L’approche classique consiste à séparer en plusieurs morceaux les traces de paquets réseaux (pcap pour packet capture), les exporter en csv dans des objets stockant la donnée (dataframes) pour les analyser en parallèle. La nouvelle approche ajoute une étape en convertissant les csv en fichiers parquets, analysés ensuite sur le disque par DuckDB. Il en résulte que cette dernière solution est bien plus rapide que l’utilisation de dataframes, et est devenue la nouvelle technique adoptée par SURF.

Tester des features dbt-core

A l’heure actuelle, il n’y a pas encore de documentation sur cette présentation (pdf ou vidéo). Je me fie donc au court retour d’un  data engineer y ayant assisté pour en faire une description. Il s’agit d’une présentation d’un développeur dbt-core qui a facilité son processus de débogage en intégrant DuckDB, qui permet en plus aisément d’extraire des données à exporter pour d’autres personnes.

Construire une plateforme de fonctionnalités

Retour d’une entreprise dans le domaine du machine learning avec un ingénieur de Tecton AI qui nous présente l’intégration de DuckDB dans son architecture. L’entreprise propose une plateforme qui permet d’alimenter les applications de machine learning avec des fonctionnalités à la demande. Elle se connecte à des sources de données diverses (S3, BigQuery, Snowflake…) et utilise Apache Spark pour effectuer ses opérations de transformation et d'agrégation. Cependant quelques problèmes liés à Spark sont remontés : des utilisateurs trouvent confuse sa configuration, la technologie nécessite un manager spark pour le déploiement, et elle est lourde au démarrage. Encore une fois, il semblerait que DuckDB ait séduit grâce à sa simplicité et sa performance: il a été choisi comme alternative à Spark, avec des résultats qui démontrent ses qualités.

Schéma issu de la présentation de Tecton montrant leur logique d’utilisation de DuckDB
Schéma issu de la présentation de Tecton montrant leur logique d’utilisation de DuckDB

Répondre à des questions plus rapidement

Pour la dernière présentation, on a le droit au retour rapide d’un ingénieur pour le Liverpool Football Club, qui exprime le sentiment magique qu’il éprouve avec DuckDB : on écrit simplement du SQL et cela fonctionne.

Conclusion

Pour un outil plutôt jeune, il semblerait que DuckDB prend petit à petit sa place dans le monde des SGBD. Il séduit de nombreuses personnes, qui arrivent à l’adapter à leur besoin grâce à la grande flexibilité de l’outil. Il en ressort que DuckDB est simple à comprendre, mettre en place, maintenir, le tout avec des performances qui font leurs preuves.

Pour rappel, la technologie sortira bientôt dans sa version 1.0.0 cette année, et de nombreuses améliorations restent à venir. Gardez donc DuckDB dans un coin de votre tête, l’équipe a l’ambition de devenir un format standard et pourrait peut-être bien le devenir.

Sources:

Documentation DuckDB : https://duckdb.org/docs/

Résumé DuckCon avec liens des pdf et conférences : https://duckdb.org/2023/10/06/duckcon4.html

Dépôt git : https://github.com/duckdb/duckdb

Article du créateur sur le pourquoi de DuckDB : https://www.infoq.com/articles/analytical-data-management-duckdb/

Chaîne youtube de DuckDB : https://www.youtube.com/@duckdb/videos

Article de Neosoft sur DuckDB : https://www.neosoft.fr/nos-publications/blog-tech/duckdb-lessayer-cest-ladopter/

Newsletter de blef.fr : https://www.blef.fr/duckcon-4-takeaways/