- S3 üzerinde 650 GB ölçeğinde Delta Lake verisi depolayıp, bunun tek düğümlü bir ortamda Polars, DuckDB, Daft, Spark ile işlendiği bir performans karşılaştırma deneyi
- 32 GB bellekli bir EC2 örneğinde her motorun büyük veriyi işleyip işleyemediği doğrulandı; küme tabanlı Spark’a karşı tek düğüm yaklaşımının olanakları araştırıldı
- DuckDB 16 dakikada, Polars 12 dakikada, Daft 50 dakikada, PySpark ise 1 saatten uzun sürede tamamlayarak, tek düğümde de pratik işlem olasılığını gösterdi
- Polars Deletion Vector desteği sunmuyor; bu özelliği yalnızca DuckDB desteklediği için Lake House uyumluluğunda fark bulunuyor
- Sonuç olarak tek düğümlü framework’lerin düşük maliyetli donanımda da büyük ölçekli veri işleyebileceği gösterildi ve dağıtık hesaplamaya bağımlılığın yeniden değerlendirilmesi gerektiği ortaya kondu
Küme yorgunluğu ve tek düğüm alternatifi
- SaaS tabanlı Lake House kümelerini işletmenin maliyeti ve karmaşıklığı arttıkça “cluster fatigue” olgusundan söz ediliyor
- Geçmişte Pandas dışında seçenek olmadığından Spark kullanılıyordu; ancak DuckDB·Polars·Daft (D.P.D.) ile tek düğümde işleme olasılığı genişledi
- D.P.D., bellekten büyük (LTM) veri kümelerini işleyebiliyor ve yüksek hızlı hesaplama sunabiliyor
- Yazı, dağıtık ve dağıtıksız olmak üzere iki seçeneği ortaya koyarken “Single Node Rebellion” kavramını vurguluyor
Deney ortamının kurulumu
- S3 üzerinde bir Delta Lake tablosu oluşturulup yaklaşık 650 GB veri depolandı (hedef 1 TB idi ancak durduruldu)
- EC2 örneğinde (32 GB RAM, 16 CPU) DuckDB, Polars ve Daft çalıştırıldı; ardından Spark ile karşılaştırıldı
- Veri, sosyal medya gönderileri biçiminde sahte veri olarak Python dict ile üretildi, ardından Daft DataFrame’e dönüştürülüp Parquet dosyalarına kaydedildi
- Sonrasında Parquet dosyaları Databricks üzerinde Delta Lake tablosuna dönüştürüldü, yıl ve ay bazlı bölümleme yapıldı
- Delta log hariç tutulduğunda yaklaşık 650 GB veri olduğu doğrulandı
Bellek kısıtı ve streaming ihtiyacı
- Tek düğümde (32 GB bellek) 650 GB verinin işlenmesi gerektiğinden streaming tarzı sorgu yürütmenin gerekliliği gündeme geldi
- Polars GitHub issue’suna atıfla, Iceberg için streaming write özelliği talep edilen örnekten bahsediliyor
- Polars ve DuckDB gibi yeni nesil framework’lerin Lake House formatlarını streaming biçimde okuyup yazmaya yönelik yerleşik desteğe ihtiyaç duyduğu vurgulanıyor
Motorlara göre test sonuçları
- DuckDB
- Deletion Vector desteği sunan tek seçenek
- 650 GB veriyi 32 GB’lık Linux makinede yalnızca 16 dakikada işlemeyi başardı
- Kod basit ve çıktı dosyası sorunsuz üretildi
- Polars
- Deletion Vector desteği olmadığından Lake House ortamında bazı sınırlamalar var
- Lazy API (Scan/Sink) kullanmak gerekiyor
- İşlemi 12 dakikada tamamladı; DuckDB’den daha hızlıydı
- Daft
- Rust tabanlı; kullanım hissi iyi olsa da 50 dakikalık işlem süresiyle en yavaşı oldu
- Iceberg ile ilgili işlerde kararlı çalıştığı görüldü
- PySpark (Databricks Single Node)
- 1 saatten uzun sürdü, herhangi bir tuning yapılmadan çalıştırıldı
- Tek düğümlü motorlara kıyasla verimliliği daha düşüktü
- Deneyin amacı hızdan çok tek düğüm yaklaşımının uygulanabilirliğini doğrulamaktı
Sonuç ve çıkarımlar
- Deney, tek düğümlü framework’lerin büyük ölçekli Lake House verisini işleyebildiğini gösterdi
- Düşük maliyetli donanımda bile makul çalışma süresi ve basit kod yapısı elde edildi
- DuckDB, Polars ve Daft’ın tümü dağıtık küme olmadan da pratik performans sundu
- Dağıtık hesaplama tek çözüm değil mesajı verilerek modern Lake House mimarisinin yeniden düşünülmesi gerektiği öne sürüldü
- “Single Node Rebellion” kavramı üzerinden maliyet etkin veri mühendisliği yaklaşımının mümkün olduğu vurgulandı
1 yorum
Hacker News görüşleri
Daft, AI iş yükleri için yüksek performanslı bir veri işleme motoru ve hem tek düğümde hem de dağıtık ortamlarda çalışıyor
Bu benchmark sayesinde paralellik ve pipelining tarafında geliştirebileceğimiz çok şey gördük. Özellikle deltalake reader ve groupby operatöründe optimize edilecek pek çok nokta vardı
Bu iyileştirmeleri gelecek sürümlere yansıtmayı planlıyoruz; ayrıntılar için GitHub, Twitter, LinkedIn sayfalarına bakabilirsiniz
Daft ilginizi çekiyorsa
pip install daftile doğrudan deneyebilirsinizAşırı araç kullanımına gerek yok, doğrudan GNU araçlarını kullanın
Bu arada eski bir yazı ama hâlâ ilginç — command-line tools can be 235x faster than your Hadoop cluster
650GB JSON verisini CLI araçlarıyla aggregate etmeye çalışırsanız DuckDB ya da ClickHouse'un paralel işleme performansına yetişmeniz zor olur. GNU Parallel ile de denedim ama sınırları vardı
Gerçekte veri kataloğu ve cluster tabanlı işler gerekir
Delta ya da Iceberg yerine Parquet dosyalarını doğrudan dolaşarak sorguluyorum
BigQuery'de sorguladığım sonuçları yerel Parquet dosyaları olarak indiriyorum (yaklaşık 1GB'lık parçalar halinde) ve sonra DuckDB ile analiz ediyorum. RAM'den çok daha büyük veriler olsa da iyi çalışıyor
Hatta bazen BigQuery ile DuckDB'nin agregasyon performansını karşılaştırıp işi iki motor arasında bölüştürüyorum. Veri mühendisliğinin eğlenceli tarafı da bu
c5.4xlarge instance'ının azami 10Gbps bant genişliğiyle S3'ten 650GB okumak en az 9 dakika sürer
I/O scheduling yöntemindeki küçük farklar sonuçları ciddi biçimde etkilemiş gibi duruyor
Hatta daha büyük bir instance kullanıp işi hızlı bitirmek daha ekonomik bile olabilir
NVMe depolama S3'ten çok daha hızlıdır ve yereldeki 8–16 çekirdekli bir CPU buluttakinden daha iyi sonuç verebilir
S3 harika bir ürün ama yerel depolama performansına yaklaşamaz
Dosya boyutu dağılımı ya da API çağrılarındaki skew daha büyük değişkenler olmuş olabilir
“Daha büyük instance daha ucuza bitirebilir” yorumuna tamamen katılıyorum
Spark, çok aşamalı büyük veri kümeleri için uygundur ve backend olarak S3 kullandığınızda ağ darboğazı doğrudan maliyete dönüşür
DuckDB/Polars'ın tek düğüm performansı etkileyici ama bu biraz pistteki bir uçakla motosikleti yarıştırmak gibi
Bu tür farklar yüzünden dağıtık hesaplamadan yorulan çok kişi var
Kaynak sınırlarını belirleyip gerçek performansı bu sınıra oranlayınca tablo çok daha netleşiyor
Farklı sistemlerin denenmiş olması güzel ama keşke bellekten büyük sorgular daha ciddi şekilde ele alınsaydı
DuckDB bellek aşımı durumunda streaming konusunda güçlü, ama Polars burada hâlâ olgunlaşma aşamasında
S3'ün varsayılan ayarları paralel okumayı engellemez; dolayısıyla asıl darboğaz büyük ihtimalle VM'in ağ bant genişliği
ClickHouse en hızlısıydı, DuckDB ise sadelik ve kararlılık açısından en iyisiydi
Flink ve PySpark 3–5 kat daha yavaştı, Dask ve Ray de fazla yavaştı
Artık çoğu iş yükünde DuckDB ya da ClickHouse ile başlamayı öneriyorum. Pandas yavaş kaldığında DuckDB ile değiştirmek benim varsayılan yaklaşımım
Tek düğümlü bir kütüphane ile 1TB civarı veri gayet rahat işlenebilir; 10TB üstüne çıkınca Spark'a geçmek yeterlidir
İlgili issue
Oysa çoğu durumda daha iyi araçlarla sorun çözülebilir
Bir zamanlar junior bir mühendis, yüzlerce 5GB'lık JSON dosyasını Python string birleştirme ile işlemeye çalışıp 18 saat harcamıştı
Bunu basit konsol araçları ve multiprocessing ile değiştirince süre 35 dakikaya düştü
Esas mesele doğru aracı seçmek
Bakımı ve çalıştırma maliyeti oldukça düşük, fiyat/performans açısından güçlü bir araç
Küçük batch write işlemlerinde çok fazla Parquet dosyası oluşması sorununu çözmek için DuckLake bunu DBMS'e (Postgres gibi) inline olarak kaydediyor
Yakın zamanda yeniden Parquet'e yazma özelliği geldi ama hâlâ daha fazla olgunlaşması gerekiyor
İlgili doküman
Katalogu bir SQL veritabanı olarak ifade etmek gerekiyor, oysa Parquet'in avantajı tam da bu karmaşıklıktan kaçınmak
Katalog da Parquet tabanlı olursa kendi kendini bootstrap eden bir format olabilir gibi görünüyor