2024-07-05
DuckDB Community Extensions
The DuckDB team
Bestehende Community Extensions finden Sie auf der Dokumentationsseite zu DuckDB Community Extensions.
DuckDB-Extensions
Designphilosophie
Eines der zentralen Designziele von DuckDB ist Einfachheit, was für uns bedeutet, dass das System schlank sein, wenige Abhängigkeiten haben und klein genug bleiben soll, um auf eingeschränkten Plattformen wie WebAssembly zu laufen. Dieses Ziel steht im direkten Widerspruch zu sehr berechtigten Nutzerwünschen nach erweiterten Funktionen wie räumlicher Datenanalyse, Vektorindizes, Anbindung an verschiedene andere Datenbanken, Unterstützung für Datenformate usw. Alle diese Funktionen in eine monolithische Binary zu backen ist sicher möglich, und manche Systeme gehen diesen Weg. Wir wollen DuckDBs Einfachheit aber bewahren. Außerdem wäre das Ausliefern aller möglichen Features für die meisten Nutzer ziemlich übertrieben, weil kein Einsatzfall alle Extensions gleichzeitig braucht (das „Microsoft-Word-Paradoxon“, bei dem selbst Power-User nur wenige Funktionen des Systems nutzen, die genaue Menge aber von Nutzer zu Nutzer variiert).
Deshalb hat DuckDB einen leistungsfähigen Extension-Mechanismus, mit dem Nutzer DuckDB um neue Funktionen erweitern können. Dieser Mechanismus erlaubt das Registrieren neuer Funktionen, die Unterstützung neuer Dateiformate und Kompressionsmethoden, den Umgang mit neuen Netzwerkprotokollen usw. Tatsächlich sind viele beliebte DuckDB-Features als Extensions implementiert: der Parquet-Reader, der JSON-Reader und der HTTPS/S3-Connector nutzen alle den Extension-Mechanismus.
Extensions nutzen
Seit Version 0.3.2 haben wir Entdeckung und Installation bereits stark vereinfacht, indem wir Extensions in einem zentralen Repository hosten. Um zum Beispiel die Spatial-Extension zu installieren, reicht Folgendes über DuckDBs SQL-Schnittstelle:
INSTALL spatial; -- onceLOAD spatial; -- on each useIm Hintergrund lädt DuckDB eine zur aktuellen Betriebssystem- und Prozessorarchitektur passende Extension-Binary (z. B. macOS auf ARM64) herunter und speichert sie im Ordner ~/.duckdb. Bei jedem LOAD wird diese Datei in die laufende DuckDB-Instanz geladen, und es geht fröhlich weiter. Damit das funktioniert, kompilieren, signieren und hosten wir die Extensions für eine ziemlich große und wachsende Liste von Kombinationen aus Prozessorarchitektur und Betriebssystem. Dieser Mechanismus wird bereits intensiv genutzt: Derzeit sehen wir etwa sechs Millionen Extension-Downloads pro Woche bei einem entsprechenden Datentransfervolumen von rund 40 Terabyte!
Bisher war das Veröffentlichen von Third-Party-Extensions ein schwieriger Prozess, der vom Extension-Entwickler den Bau der Extensions in den eigenen Repositories für eine Reihe von Plattformen verlangte. Außerdem konnten sie die Extensions nicht mit offiziellen Schlüsseln signieren, sodass Nutzer die Option allow_unsigned_extensions verwenden mussten, die Signaturprüfungen deaktiviert – was selbst problematisch ist.
DuckDB Community Extensions
Software sicher zu verteilen war noch nie einfacher, sodass wir eine breite Nutzerschaft über pip, conda, cran, npm, brew usw. erreichen. Wir wollen eine ähnliche Erfahrung sowohl für Nutzer bieten, die die gewünschte Extension einfach greifen können, als auch für Entwickler, die nicht mit Verteilungsdetails belastet werden sollen. Uns liegt auch daran, die Schwelle zu senken, Hilfsmittel und Skripte als DuckDB-Extension zu packen, damit Nutzer nützliche Funktionen aus ihrem Fachgebiet (oder ihren Schmerzpunkten) bereitstellen können.
Wir glauben, dass der Aufbau eines Community-Extension-Ökosystems der nächste logische Schritt für DuckDB ist. Deshalb freuen wir uns sehr, unser Community-Extensions-Repository zu starten, das auf dem Data + AI Summit angekündigt wurde.
Für Nutzer erlaubt dieses Repository einfaches Entdecken, Installieren und Pflegen von Community Extensions direkt aus der DuckDB-SQL-Eingabe. Für Entwickler vereinfacht es den Veröffentlichungsprozess von Extensions erheblich. Im Folgenden beschreiben wir, wie das neue Extension-Repository die Erfahrungen dieser Gruppen verbessert.
Nutzererlebnis
Als Beispiel nutzen wir die h3-Extension. Diese Extension implementiert hierarchische hexagonale Indizierung für Geodaten.
Über das DuckDB-Community-Extensions-Repository können Sie die h3-Extension jetzt so installieren und laden:
INSTALL h3 FROM community;LOAD h3;Danach können Sie sie sofort nutzen. Beachten Sie, dass die Beispieldaten 500 MB groß sind:
SELECT h3_latlng_to_cell(pickup_latitude, pickup_longitude, 9) AS cell_id, h3_cell_to_boundary_wkt(cell_id) AS boundary, count() AS cntFROM read_parquet('https://blobs.duckdb.org/data/yellow_tripdata_2010-01.parquet')GROUP BY cell_idHAVING cnt > 10;Beim Laden wird die Signatur der Extension geprüft, sowohl um Plattform- und Versionskompatibilität sicherzustellen als auch um zu verifizieren, dass die Quelle der Binary das Community-Extensions-Repository ist. Extensions werden für Linux, macOS, Windows und WebAssembly gebaut, signiert und verteilt. Damit sind Extensions für jeden DuckDB-Client ab Version 1.0.0 und kommende Versionen verfügbar.
Die Dokumentation der h3-Extension steht unter https://duckdb.org/community_extensions/extensions/h3.
Entwicklererlebnis
Aus Entwicklersicht übernimmt das Community-Extensions-Repository die Schritte, die zum Veröffentlichen von Extensions nötig sind, einschließlich des Baus der Extensions für alle relevanten Plattformen, des Signierens der Extension-Binaries und der Bereitstellung aus dem Repository.
Für den Maintainer von h3 umfasste der Veröffentlichungsprozess die folgenden Schritte:
-
Einen PR mit einer Metadatendatei
description.ymlsenden, die die Beschreibung der Extension enthält:extension:name: h3description: Hierarchical hexagonal indexing for geospatial dataversion: 1.0.0language: C++build: cmakelicense: Apache-2.0maintainers:- isaacbrodskyrepo:github: isaacbrodsky/h3-duckdbref: 3c8a5358e42ab8d11e0253c70f7cc7d37781b2ef -
Die CI baut und testet die Extension. Die von der CI durchgeführten Prüfungen sind am
extension-template-Repository ausgerichtet, sodass Iterationen unabhängig möglich sind. -
Auf die Freigabe durch die Maintainer des DuckDB-Community-Extensions-Repositorys und den Abschluss des Build-Prozesses warten.
Veröffentlichte Extensions
Um zu zeigen, dass das Veröffentlichen von Extensions machbar ist, haben wir einige Entwickler wichtiger Extensions angesprochen. Zum Zeitpunkt der Veröffentlichung dieses Blogposts enthält das DuckDB-Community-Extensions-Repository bereits die folgenden Extensions.
| Name | Beschreibung |
|---|---|
| crypto | Fügt kryptografische Hash-Funktionen und HMAC hinzu. |
| h3 | Implementiert hierarchische hexagonale Indizierung für Geodaten. |
| lindel | Implementiert Linearisierung/Delinearisierung, Z-Order-, Hilbert- und Morton-Kurven. |
| prql | Ermöglicht das Ausführen von PRQL-Befehlen direkt in DuckDB. |
| scrooge | Unterstützt eine Menge von Aggregatfunktionen und Datenscannern für Finanzdaten. |
| shellfs | Ermöglicht die Nutzung von Shell-Befehlen für Ein- und Ausgabe. |
DuckLabs und die DuckDB Foundation prüfen den Code in Community Extensions nicht und können daher nicht garantieren, dass DuckDB Community Extensions sicher zu verwenden sind. Das Laden von Community Extensions lässt sich mit der folgenden Einweg-Konfigurationsoption explizit deaktivieren:
SET allow_community_extensions = false;Weitere Details finden Sie auf der Dokumentationsseite DuckDB absichern.
Zusammenfassung und Ausblick
In diesem Blogpost haben wir das DuckDB-Community-Extensions-Repository vorgestellt, das die einfache Installation von Third-Party-DuckDB-Extensions ermöglicht.
Wir freuen uns darauf, dieses Repository stetig zu erweitern. Wenn Sie eine Idee für eine Extension haben, schauen Sie sich die bereits veröffentlichten Extension-Quellcodes an, die gute Beispiele für das Paketieren von Community Extensions liefern, und treten Sie dem Kanal #extensions auf unserem Discord bei.
Sobald Sie eine Extension haben, tragen Sie sie bitte über einen Pull Request bei.
Schließlich möchten wir uns bei den Early Adopters von DuckDBs Extension-Mechanismus und Community-Extensions-Repository bedanken. Danke, dass Sie mit uns iteriert und uns Feedback gegeben haben.