- Delta-Lake-Daten im Umfang von 650 GB auf S3 gespeichert und ein Performance-Vergleich durchgeführt, wie diese in einer Single-Node-Umgebung mit Polars, DuckDB, Daft und Spark verarbeitet werden
- Auf einer EC2-Instanz mit 32 GB Speicher wurde geprüft, ob die einzelnen Engines große Datenmengen verarbeiten können, und im Vergleich zu clusterbasiertem Spark das Potenzial eines Single Nodes untersucht
- DuckDB benötigte 16 Minuten, Polars 12 Minuten, Daft 50 Minuten und PySpark mehr als eine Stunde, was zeigt, dass praktische Verarbeitung auch auf einem Single Node möglich ist
- Polars unterstützt keine Deletion Vectors, nur DuckDB unterstützt diese Funktion, wodurch es Unterschiede bei der Lake-House-Kompatibilität gibt
- Insgesamt zeigt das Ergebnis, dass Single-Node-Frameworks auch auf kostengünstiger Hardware große Datenmengen verarbeiten können, und regt dazu an, die Abhängigkeit von Distributed Computing neu zu bewerten
Cluster-Müdigkeit und die Single-Node-Alternative
- Mit den steigenden Kosten und der Komplexität des Betriebs von SaaS-basierten Lake-House-Clustern wird das Phänomen der „Cluster-Müdigkeit“ (
cluster fatigue) erwähnt
- Früher wurde Spark genutzt, weil es außer Pandas kaum Alternativen gab; mit dem Aufkommen von DuckDB, Polars und Daft (D.P.D.) haben sich die Möglichkeiten für Single-Node-Verarbeitung erweitert
- D.P.D. kann größer-als-Arbeitsspeicher-(LTM)-Datensätze verarbeiten und ermöglicht schnelle Berechnungen
- Der Artikel stellt verteilte und nicht verteilte Ansätze als zwei Optionen gegenüber und betont das Konzept der „Single Node Rebellion“
Aufbau der Testumgebung
- Eine Delta-Lake-Tabelle auf S3 erstellt und rund 650 GB Daten gespeichert (Ziel waren 1 TB, wurde aber abgebrochen)
- Auf einer EC2-Instanz (32 GB RAM, 16 CPU) wurden DuckDB, Polars und Daft ausgeführt und anschließend mit Spark verglichen
- Die Daten bestanden aus simulierten Social-Media-Posts; Python-
dicts wurden erzeugt, in einen Daft DataFrame umgewandelt und als Parquet-Dateien gespeichert
- Anschließend wurden die Parquet-Dateien in Databricks in eine Delta-Lake-Tabelle umgewandelt und nach Jahr und Monat partitioniert
- Ohne das Delta-Log wurden etwa 650 GB Daten bestätigt
Speichergrenzen und die Notwendigkeit von Streaming
- Da auf einem Single Node mit 32 GB Speicher 650 GB Daten verarbeitet werden mussten, wurde die Notwendigkeit einer Streaming-basierten Ausführung von Abfragen hervorgehoben
- Unter Verweis auf ein Polars-GitHub-Issue wird ein Beispiel erwähnt, in dem Streaming-Schreibfunktionen für Iceberg gefordert werden
- Es wird betont, dass neue Frameworks wie Polars und DuckDB grundlegende Unterstützung dafür brauchen, Lake-House-Formate per Streaming zu lesen und zu schreiben
Testergebnisse nach Engine
- DuckDB
- Einzige Engine mit Unterstützung für Deletion Vectors
- Verarbeitete 650 GB Daten auf einer Linux-Maschine mit 32 GB in nur 16 Minuten erfolgreich
- Der Code war einfach und die Ergebnisdatei wurde korrekt erzeugt
- Polars
- Wegen fehlender Unterstützung für Deletion Vectors in Lake-House-Umgebungen eingeschränkt
- Die Lazy API (
Scan/Sink) muss verwendet werden
- Verarbeitung in nur 12 Minuten, also schneller als DuckDB
- Daft
- Rust-basiert, gute Nutzungserfahrung, aber mit 50 Minuten Verarbeitungszeit am langsamsten
- Bei Iceberg-bezogenen Arbeiten wurde ein stabiler Betrieb bestätigt
- PySpark (Databricks Single Node)
- Mehr als eine Stunde Laufzeit, ohne Tuning ausgeführt
- Im Vergleich zu Single-Node-Engines weniger effizient
- Ziel des Experiments war weniger Geschwindigkeit als vielmehr die Überprüfung der Realisierbarkeit eines Single Nodes
Fazit und Implikationen
- Das Experiment zeigt, dass Single-Node-Frameworks große Lake-House-Datenmengen verarbeiten können
- Selbst auf kostengünstiger Hardware sind vernünftige Laufzeiten und eine einfache Code-Struktur möglich
- DuckDB, Polars und Daft liefern alle praktikable Leistung auch ohne verteilten Cluster
- Es zeigt, dass Distributed Computing nicht die einzige Lösung ist, und legt eine Neubewertung moderner Lake-House-Architekturen nahe
- Das Konzept der „Single Node Rebellion“ hebt das Potenzial eines kosteneffizienten Data-Engineering-Ansatzes hervor
1 Kommentare
Hacker-News-Kommentar
Daft ist eine leistungsstarke Datenverarbeitungs-Engine für AI-Workloads und läuft sowohl auf einem einzelnen Knoten als auch in verteilten Umgebungen
Durch diesen Benchmark haben wir viele Möglichkeiten entdeckt, Parallelität und Pipelining zu verbessern. Besonders beim deltalake-Reader und beim groupby-Operator gibt es noch viel zu optimieren
Wir planen, diese Verbesserungen in künftige Releases einfließen zu lassen; mehr dazu findet ihr auf GitHub, Twitter und LinkedIn
Wenn euch Daft interessiert, könnt ihr es mit
pip install daftselbst ausprobierenStatt übertriebenem Tooling sollte man einfach GNU-Tools verwenden
Zur Referenz, ein älterer, aber immer noch interessanter Beitrag — command-line tools can be 235x faster than your Hadoop cluster
Wenn man 650 GB JSON-Daten mit CLI-Tools aggregiert, wird es schwer, an die Parallelisierungsleistung von DuckDB oder ClickHouse heranzukommen. Ich habe es auch mit GNU Parallel versucht, aber das hatte Grenzen
In der Praxis braucht man dann einen Datenkatalog und clusterbasierte Verarbeitung
Statt Delta oder Iceberg durchlaufe ich Parquet-Dateien direkt und frage sie ab
Ich lade Abfrageergebnisse aus BigQuery als lokale Parquet-Dateien herunter (jeweils etwa 1 GB) und analysiere sie mit DuckDB. Die Daten sind deutlich größer als der RAM, aber es funktioniert gut
Ich vergleiche auch die Aggregationsleistung von BigQuery und DuckDB und teile Jobs manchmal zwischen beiden Engines auf. Genau solche Kombinationen machen Data Engineering interessant
Mit den maximal 10 Gbps einer c5.4xlarge-Instanz dauert es mindestens 9 Minuten, 650 GB aus S3 zu lesen
Schon kleine Unterschiede im I/O-Scheduling dürften das Ergebnis stark beeinflusst haben
Vielleicht ist es sogar wirtschaftlicher, größere Instanzen zu verwenden und schneller fertig zu sein
NVMe-Storage ist viel schneller als S3, und eine lokale CPU mit 8 bis 16 Kernen könnte besser sein als die Cloud
S3 ist ein großartiges Produkt, kommt aber an die Leistung lokaler Speicher nicht heran
Die Verteilung der Dateigrößen oder eine Schieflage bei API-Aufrufen waren vermutlich die größeren Variablen
Der Aussage „Eine größere Instanz könnte am Ende billiger sein“ stimme ich vollkommen zu
Spark eignet sich für große mehrstufige Datensätze, und wenn S3 als Backend verwendet wird, zeigt sich der Netzwerkengpass unmittelbar in den Kosten
Die Single-Node-Performance von DuckDB und Polars ist beeindruckend, aber das ist so, als würde man ein Flugzeug auf der Startbahn gegen ein Motorrad antreten lassen
Solche Unterschiede sind auch ein Grund, warum viele von verteiltem Computing genervt sind
Wenn man die Ressourcenlimits kennt und die reale Leistung als Verhältnis zu diesen Grenzen ausdrückt, wird alles viel klarer
Es ist gut, dass verschiedene Systeme ausprobiert wurden, aber ich hätte mir gewünscht, dass Abfragen größer als der Arbeitsspeicher ernsthaft behandelt werden
DuckDB ist stark beim Streaming über die Speicherkapazität hinaus, während Polars hier noch unreif ist
Die Standardeinstellungen von S3 verhindern paralleles Lesen nicht, daher ist am Ende vermutlich die Netzwerkbandbreite der VM der Engpass
ClickHouse war am schnellsten, DuckDB war in Sachen Einfachheit und Stabilität am besten
Flink und PySpark waren 3- bis 5-mal langsamer, und auch Dask und Ray waren zu langsam
Ich würde inzwischen empfehlen, bei den meisten Workloads mit DuckDB oder ClickHouse zu starten. Wenn Pandas zu langsam ist, ersetze ich es standardmäßig durch DuckDB
Selbst mit einer Single-Node-Bibliothek kann man etwa 1 TB gut verarbeiten; erst ab mehr als 10 TB sollte man zu Spark wechseln
Zugehöriges Issue
Dabei lässt sich vieles mit besseren Tools lösen
Früher brauchte ein Junior Engineer 18 Stunden, um mehrere hundert 5-GB-JSON-Dateien per Python-Stringverkettung zu verarbeiten,
nach dem Umstieg auf einfache Konsolen-Tools und multiprocessing waren es nur noch 35 Minuten
Die Wahl des richtigen Werkzeugs ist entscheidend
Betrieb und Ausführung sind sehr günstig, und es ist ein Tool mit starkem Preis-Leistungs-Verhältnis
Um das Problem zu lösen, dass bei kleinen Batch-Schreibvorgängen zu viele Parquet-Dateien entstehen, speichert DuckLake diese inline in einem DBMS (z. B. Postgres)
Erst vor Kurzem kam die Funktion hinzu, sie wieder in Parquet zurückzuschreiben, aber das muss noch stabilisiert werden
Zugehörige Dokumentation
Der Katalog muss als SQL-Datenbank ausgedrückt werden, während der Vorteil von Parquet gerade darin besteht, diese Komplexität zu vermeiden
Würde man auch den Katalog auf Parquet aufbauen, könnte daraus vielleicht ein selbstbootstrapendes Format werden