Data 650GB (Delta Lake di S3). Polars vs. DuckDB vs. Daft vs. Spark
(dataengineeringcentral.substack.com)- Eksperimen perbandingan performa untuk memproses data Delta Lake berukuran 650GB yang disimpan di S3 menggunakan Polars, DuckDB, Daft, dan Spark dalam lingkungan single-node
- Memverifikasi apakah tiap engine dapat menangani data berukuran besar pada instance EC2 dengan memori 32GB, sambil mengeksplorasi kemungkinan single-node dibanding Spark berbasis klaster
- DuckDB membutuhkan 16 menit, Polars 12 menit, Daft 50 menit, dan PySpark lebih dari 1 jam, yang menunjukkan kelayakan pemrosesan nyata bahkan di single-node
- Polars tidak mendukung Deletion Vector, sementara hanya DuckDB yang mendukung fitur tersebut, sehingga ada perbedaan dalam kompatibilitas Lake House
- Secara keseluruhan, eksperimen ini membuktikan bahwa framework single-node mampu memproses data skala besar bahkan pada hardware berbiaya rendah, dan memunculkan kebutuhan untuk meninjau kembali ketergantungan pada komputasi terdistribusi
Kelelahan terhadap klaster dan alternatif single-node
- Disebutkan fenomena "cluster fatigue" seiring meningkatnya biaya dan kompleksitas operasional klaster Lake House berbasis SaaS
- Dulu Spark digunakan karena tidak ada alternatif selain Pandas, tetapi kemunculan DuckDB, Polars, dan Daft (D.P.D.) memperluas kemungkinan pemrosesan single-node
- D.P.D. memungkinkan pemrosesan dataset yang lebih besar dari memori (LTM) dan komputasi berkecepatan tinggi
- Tulisan ini menawarkan dua pilihan, terdistribusi dan non-terdistribusi, sambil menekankan konsep "Single Node Rebellion"
Susunan lingkungan eksperimen
- Membuat tabel Delta Lake di S3 dan menyimpan sekitar 650GB data (target awal 1TB, tetapi dihentikan)
- Menjalankan DuckDB, Polars, dan Daft pada instance EC2 (32GB RAM, 16 CPU) lalu membandingkannya dengan Spark
- Data berupa data simulasi berbentuk posting media sosial; dibuat sebagai Python dict, diubah menjadi Daft DataFrame, lalu disimpan sebagai file Parquet
- Setelah itu, file Parquet dikonversi menjadi tabel Delta Lake di Databricks, dengan partisi per tahun dan bulan
- Jika log Delta dikecualikan, terkonfirmasi ada sekitar 650GB data
Batasan memori dan kebutuhan streaming
- Karena 650GB data harus diproses pada single-node dengan memori 32GB, muncul kebutuhan untuk menjalankan query dengan metode streaming
- Dengan mengutip issue di GitHub Polars, disebutkan contoh kebutuhan akan fitur penulisan streaming ke Iceberg
- Ditekankan bahwa framework baru seperti Polars dan DuckDB memerlukan dukungan bawaan untuk membaca dan menulis format Lake House secara streaming
Hasil pengujian tiap engine
- DuckDB
- Satu-satunya yang mendukung Deletion Vector
- Berhasil memproses 650GB data di mesin Linux 32GB hanya dalam 16 menit
- Kodenya sederhana dan file hasil berhasil dibuat dengan normal
- Polars
- Karena tidak mendukung Deletion Vector, ada keterbatasan di lingkungan Lake House
- Perlu menggunakan Lazy API (Scan/Sink)
- Selesai diproses dalam 12 menit, lebih cepat daripada DuckDB
- Daft
- Berbasis Rust, nyaman digunakan, tetapi waktu proses 50 menit sehingga menjadi yang paling lambat
- Dipastikan berjalan stabil dalam pekerjaan terkait Iceberg
- PySpark (Databricks Single Node)
- Memerlukan lebih dari 1 jam, dijalankan tanpa tuning
- Efisiensinya lebih rendah dibanding engine single-node
- Tujuan eksperimen ini bukan semata kecepatan, melainkan memverifikasi kelayakan single-node
Kesimpulan dan implikasi
- Eksperimen ini membuktikan bahwa framework single-node dapat memproses data Lake House berukuran besar
- Bahkan pada hardware berbiaya rendah, diperoleh waktu eksekusi yang masuk akal dan struktur kode yang sederhana
- DuckDB, Polars, dan Daft semuanya memberikan performa yang praktis tanpa klaster terdistribusi
- Ini menunjukkan bahwa komputasi terdistribusi bukan satu-satunya solusi, dan mendorong peninjauan ulang arsitektur Lake House modern
- Melalui konsep "Single Node Rebellion", artikel ini menyoroti kemungkinan pendekatan data engineering yang lebih efisien dari sisi biaya
1 komentar
Opini Hacker News
Daft adalah mesin pemrosesan data berkinerja tinggi untuk workload AI, dan berjalan baik di lingkungan single-node maupun terdistribusi
Melalui benchmark kali ini, kami menemukan banyak ruang untuk peningkatan pada paralelisme dan pipelining. Terutama pada pembaca deltalake dan operator groupby, masih banyak bagian yang bisa dioptimalkan
Kami berencana memasukkan perbaikan ini pada rilis mendatang, dan detail lebih lanjut dapat dilihat di GitHub, Twitter, LinkedIn
Jika Daft terdengar menarik, Anda bisa langsung mencobanya dengan
pip install daftDaripada tooling berlebihan, pakai saja tool GNU
Sebagai referensi, ini tulisan lama tapi masih menarik — command-line tools can be 235x faster than your Hadoop cluster
Kalau Anda mencoba mengagregasi 650GB data JSON dengan tool CLI, akan sulit menyaingi kinerja pemrosesan paralel DuckDB atau ClickHouse. Saya juga pernah mencoba dengan GNU Parallel, tetapi ada batasannya
Dalam praktik nyata, Anda akan memerlukan katalog data dan pekerjaan berbasis klaster
Saya men-query dengan menelusuri file Parquet secara langsung alih-alih memakai Delta atau Iceberg
Saya mengunduh hasil query dari BigQuery ke file Parquet lokal (sekitar 1GB per file) lalu menganalisisnya dengan DuckDB. Datanya jauh lebih besar daripada RAM, tetapi tetap berjalan baik
Saya juga membandingkan perbedaan kinerja agregasi antara BigQuery dan DuckDB, lalu membagi pekerjaan agar dijalankan di dua engine itu. Kombinasi seperti ini adalah bagian menarik dari data engineering
Dengan bandwidth maksimum 10Gbps pada instance c5.4xlarge, membaca 650GB dari S3 akan memakan waktu minimal 9 menit
Perbedaan kecil dalam cara penjadwalan I/O kemungkinan besar memberi pengaruh besar pada hasil
Bahkan, bisa jadi lebih ekonomis memakai instance yang lebih besar agar selesai lebih cepat
Penyimpanan NVMe jauh lebih cepat daripada S3, dan CPU lokal 8–16 core bisa jadi lebih baik daripada cloud
S3 adalah produk yang hebat, tetapi tidak bisa menandingi kinerja storage lokal
Distribusi ukuran file atau skew pada panggilan API mungkin justru menjadi variabel yang lebih besar
Saya sepenuhnya setuju dengan pernyataan bahwa “instance yang lebih besar bisa jadi selesai lebih murah”
Spark cocok untuk dataset besar multi-tahap, dan ketika memakai S3 sebagai backend, bottleneck jaringan akan terlihat langsung sebagai biaya
Kinerja single-node DuckDB/Polars memang mengesankan, tetapi ini seperti memperlombakan pesawat di landasan dengan sepeda motor
Perbedaan seperti ini adalah salah satu alasan banyak orang merasa lelah dengan komputasi terdistribusi
Jika Anda memahami batas sumber daya dan mengekspresikan kinerja aktual sebagai rasio terhadap batas itu, hasilnya akan jauh lebih jelas
Bagus bahwa mereka mencoba berbagai sistem, tetapi saya berharap mereka benar-benar membahas query yang lebih besar daripada memori
DuckDB kuat dalam streaming yang melebihi memori, tetapi Polars masih belum matang
Konfigurasi default S3 tidak menghalangi pembacaan paralel, jadi kemungkinan besar bandwidth jaringan VM-lah bottleneck utamanya
ClickHouse adalah yang tercepat, sementara DuckDB adalah yang terbaik dari sisi kesederhanaan dan stabilitas
Flink dan PySpark 3–5 kali lebih lambat, dan Dask serta Ray juga terlalu lambat
Sekarang saya biasanya menyarankan memulai dengan DuckDB atau ClickHouse untuk sebagian besar workload. Mengganti Pandas dengan DuckDB saat Pandas terasa lambat adalah strategi default saya
Bahkan dengan library single-node, sekitar 1TB masih sangat bisa ditangani, dan barulah di atas 10TB masuk akal beralih ke Spark
Isu terkait
Padahal sering kali masalahnya bisa diselesaikan dengan tool yang lebih baik
Dulu ada engineer junior yang butuh 18 jam untuk memproses ratusan file JSON berukuran 5GB dengan penggabungan string Python,
tetapi setelah diganti dengan tool konsol sederhana dan multiprocessing, waktunya turun menjadi 35 menit
Memilih tool yang tepat adalah kuncinya
Biaya maintenance dan operasionalnya sangat rendah, dan ini adalah tool dengan value-for-money yang baik
Untuk mengatasi masalah terlalu banyak file Parquet saat menulis batch kecil, DuckLake menyimpan data itu secara inline di DBMS (seperti Postgres)
Fitur untuk menuliskannya kembali ke Parquet baru ditambahkan belakangan ini, jadi masih perlu distabilkan
Dokumentasi terkait
Katalognya harus direpresentasikan sebagai SQL DB, padahal salah satu kelebihan Parquet justru adalah menghindari kompleksitas itu
Jika katalognya juga dibuat berbasis Parquet, sepertinya itu bisa menjadi format yang self-bootstrapping