- Ein Open-Source-Format und Interface, das dafür entwickelt wurde, strukturierte Datenverarbeitungsoperationen (relationale Algebra, Query-Pläne usw.) zu serialisieren und zwischen verschiedenen Datenbanken, Analyse- und Query-Engines auszutauschen
- Wird von verschiedenen DB-, Distributed-Processing- und Query-Engines wie DuckDB, Spark, DataFusion und Sirius eingeführt bzw. übernommen, um den Austausch von Queries/Ausführungsplänen und Kompatibilität zwischen unterschiedlichen Systemen sicherzustellen
- Stellt Ausführungspläne aus unterschiedlichen Query-Sprachen oder Engines wie SQL, DataFrame und Pandas in einem neutralen/standardisierten Format (Protocol Buffers, YAML, JSON usw.) dar und vereinfacht damit die Integration von Plugins und Third-Party-Engines sowie die Anbindung von Hardware-Beschleunigern
Was ist Substrait?
- Ein Open-Source-Projekt, das den „Query-Plan“ (Logical/Physical Plan) von Datenanalyse- und Datenverarbeitungssystemen als Standardformat definiert
- Serialisiert/deserialisiert Query-Strukturen aus verschiedenen Sprachen wie SQL, DataFrame und LINQ (z. B. SELECT-FROM-WHERE, Join, Aggregation, Projection, Filter usw.) in ein Standardschema
- Da Query-Parser und Ausführungspläne je nach Datenbank und Engine unterschiedlich sind, gibt es Grenzen bei Interoperabilität und der Nutzung von Hardware-Beschleunigern → Abstraktion über einen gemeinsamen Standard (Intermediate Representation)
- Ausführungspläne aus unterschiedlichen Query-Sprachen und Frameworks wie SQL, DataFrame und Pandas lassen sich ins Substrait-Format konvertieren und gemeinsam nutzen
Die wichtigsten Merkmale von Substrait
- Neutrale Query-Repräsentation: Sowohl logische (logische Operatoren) als auch physische (Ausführungsoperatoren) Query-Pläne können dargestellt werden
- Protocol-Buffers-basierte Serialisierung (vor allem mit
.proto-Schemas), die effizienten Datenaustausch in verschiedenen Sprachen und Systemen ermöglicht
- Erweiterbarkeit für Engines/Plugins: Neue Funktionen, Operatoren und Typen lassen sich ebenfalls per Plugin-Modell erweitern
- Anbindung von Hardware-Beschleunigern: Einfache Integration mit Engines für GPU/FPGA/spezialisierte Beschleuniger auf Ebene des Query-Plans (Sirius, Velox, NVIDIA RAPIDS usw.)
- Plattformübergreifende Interoperabilität: Verschiedene Engines für Data Lakes, Distributed Processing oder lokale Analysen können denselben Query-Plan übernehmen und ausführen
Warum ist Substrait wichtig?
- Statt dass jede Engine eigene Custom-Interfaces baut, wird mit Unterstützung von Substrait sofort eine Integration ins Ökosystem möglich
- Dient als „gemeinsame Sprache für Query- und Analyseausführungspläne“ zwischen Daten-Engines und Plattformen
- Query in der DB → Substrait-Plan → Weitergabe und Ausführung auf GPU-/Distributed-Engines oder separaten Beschleunigern
- Verbindung zwischen Engines auf „Ausführungsplan-Ebene“, ohne dass Query-Konvertierung oder -Umschreibung nötig ist
- Auch wenn neue Query-Engines entstehen, lassen sie sich leicht als „Plugins“ austauschen oder kombinieren (Flexibilität beim Engine-Wechsel)
- Vereinheitlicht verschiedene Query-Sprachen und Umgebungen wie SQL/Python/Distributed Query
- Ermöglicht den gemischten Betrieb verschiedener Engines in Cluster- und Distributed-Umgebungen (Unterstützung heterogener Umgebungen)
- Durch die Bereitstellung einer Textversion lassen sich Query-Pläne leicht analysieren oder mit Visualisierungstools verknüpfen
Beispiele aus der Praxis
- Austausch von Query-Plänen zwischen SQL-Parser und Ausführungs-Engine (Calcite → Arrow, DuckDB → Sirius usw.)
- DuckDB: Unterstützt den Export interner Query-Pläne nach Substrait sowie den Import externer Substrait-Queries
- Sirius: Kann einen in DuckDB erzeugten Substrait-Query-Plan direkt übernehmen und SQL auf der GPU ausführen, ohne Query-Parsing oder Änderungen
- Ausführung von DataFrame-Operationen (z. B. Pandas) in externen Datenbanken
- Entwicklung von Third-Party-Tools zur Visualisierung von Query-Plänen (D3, Web usw.)
- Velox, Spark, DataFusion usw.: Exportieren die Query-Pläne ihrer jeweiligen Engines nach Substrait und integrieren sie so mit verschiedenen Analyse- und Beschleuniger-Engines
Wie ist es technisch aufgebaut?
- Substrait-Pläne werden hauptsächlich auf Basis von Protocol Buffers (
.proto) definiert
- Bestehen aus LogicalPlan, PhysicalPlan, Rel, Expression, Function usw.
- Klare Schemas je Operator wie Filter, Join, Aggregate, Project und Sort
- Erweiterbarer Funktions-/Typkatalog sowie Erweiterbarkeit für UDFs (User-Defined Functions)
Fazit
- Substrait ist der „Standard für Query-Ausführungspläne“ im Ökosystem von Datenbanken und Analyseplattformen und ein zentraler Baustein für Interoperabilität zwischen Engines, Hardware-Beschleunigung und die Erweiterbarkeit des Datenökosystems
- Es etabliert sich als grundlegender Standard zur Vereinfachung der Anbindung von Hardware-Beschleunigern und der Integration von Query-Engines und erleichtert den Aufbau einer hochperformanten Analyseinfrastruktur auch ohne komplexes Query-Parsing oder aufwendige Konvertierung
Noch keine Kommentare.