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; -- once
LOAD spatial; -- on each use

Im 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 cnt
FROM read_parquet('https://blobs.duckdb.org/data/yellow_tripdata_2010-01.parquet')
GROUP BY cell_id
HAVING 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:

  1. Einen PR mit einer Metadatendatei description.yml senden, die die Beschreibung der Extension enthält:

    extension:
    name: h3
    description: Hierarchical hexagonal indexing for geospatial data
    version: 1.0.0
    language: C++
    build: cmake
    license: Apache-2.0
    maintainers:
    - isaacbrodsky
    repo:
    github: isaacbrodsky/h3-duckdb
    ref: 3c8a5358e42ab8d11e0253c70f7cc7d37781b2ef
  2. 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.

  3. 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.