9 puan yazan xguru 2024-10-17 | Henüz yorum yok. | WhatsApp'ta paylaş
  • "Sütunlu dosya formatlarının LLVM'si"
  • Sıkıştırılmış Apache Arrow dizilerini bellek, disk ve ağ üzerinden işlemek için araç takımı içeren sütunlu biçimde bir dosya formatı
  • Apache Parquet'nin iddialı halefi olarak, zstd kullanan Parquet ile neredeyse aynı sıkıştırma oranını ve yazma aktarım hızını korurken 100-200 kat daha hızlı rastgele erişim okumaları ve 2-10 kat daha hızlı tarama sunar
    • Çok büyük tabloları (on binlerce sütun) ve GPU üzerinde açmayı da destekler
  • Vortex, sütunlu dosya formatları için Apache DataFusion'ın sorgu motorları için sunduğuna benzer bir rol üstlenecek şekilde tasarlanmıştır
    • Yani yüksek genişleyebilirlik, çok yüksek hız ve kutudan çıktığı gibi gelen özellikler öne çıkar

[!Uyarı] > Hâlâ aktif olarak geliştirilmektedir

  • Başlıca özellikler:
    • Logical Types - Fiziksel yerleşim hakkında hiçbir varsayım yapmayan şema tanımı
    • Zero-Copy to Arrow - Kanonikleştirilmiş Vortex dizileri, Apache Arrow dizilerine zero-copy dönüştürülebilir
    • Extensible Encodings - Eklenti tarzı fiziksel yerleşim kümeleri. Arrow uyumlu encoding'lere ek olarak en yeni encoding'ler (FastLanes, ALP, FSST vb.) uzantı olarak sunulur
    • Cascading Compression - Veriler birden çok iç içe encoding ile özyinelemeli olarak sıkıştırılabilir
    • Pluggable Compression Strategies - Yerleşik compressor BtrBlocks tabanlıdır, ancak başka stratejiler de kolayca kullanılabilir
    • Compute - Encoding'li veri üzerinde çalışan temel hesaplama kernel'leri (ör. filter pushdown)
    • Statistics - Her dizi, okuma anında isteğe bağlı hesaplanan özet istatistiklere sahiptir. Hesaplama kernel'lerinde ve compressor'larda kullanılabilir
    • Serialization - IPC ve dosya formatı için dizilerin zero-copy serileştirilmesi
    • Columnar File Format (devam ediyor) - Vortex serde kütüphanesini kullanarak sıkıştırılmış dizi verilerini depolayan modern bir dosya formatı. Rastgele erişimli okumalar ve çok hızlı taramalar için optimize edilmiştir. Apache Parquet'nin devamı olmayı hedefler

Genel bakış: Logical vs Physical

  • Vortex'in temel tasarım ilkelerinden biri, mantıksal kaygılar ile fiziksel kaygıların sıkı biçimde ayrılmasıdır
    • Örn: Vortex dizileri, mantıksal veri tipiyle (skaler öğelerin tipi) ve fiziksel encoding ile (dizinin kendi tipi) tanımlanır
  • Yerleşik encoding'ler öncelikle Apache Arrow'un bellek içi formatını modellemek için tasarlanmıştır. Ayrıca başka encoding'lerin yararlı yapı taşları olarak kullanılan yerleşik encoding'ler (sparse, chunked) de vardır. Uzantı encoding'leri ise çoğunlukla length encoding veya dictionary encoding gibi sıkıştırılmış bellek içi dizileri modellemek içindir
  • vortex-serde, Vortex dizilerinin düşük seviyeli fiziksel ayrıntılarını ele almak üzere tasarlanmıştır. Hangi encoding'in kullanılacağına veya verinin mantıksal olarak nasıl parçalara ayrılacağına Compressor uygulaması karar verir
  • (Geliştirilmekte olan) Vortex dosya formatının benzersiz özelliklerinden biri, verinin fiziksel yerleşimini dosyanın footer kısmında encoding etmesidir. Bu sayede dosya formatı fiilen kendini tanımlar hale gelir ve dosya formatı spesifikasyonunun uyumluluğunu bozmadan evrim geçirebilir
  • İleriye dönük uyumluluğu desteklemek için WASM decoder'larının isteğe bağlı olarak dosyanın içine gömülmesi hedeflenmiştir. Bu, diğer sütunlu dosya formatlarını zorlayan hızlı katılaşmanın önüne geçmeye yardımcı olacaktır

Bileşenler

Logical Types

  • Vortex tip sistemi hâlâ değişim içindedir. Mevcut mantıksal tipler:
    • Null
    • Bool
    • Integer(8, 16, 32, 64)
    • Float(16, b16, 32, 64)
    • Binary
    • UTF8
    • Struct
    • List (kısmen uygulanmış)
    • Date/Time/DateTime/Duration (uzantı tipleri olarak uygulanmıştır)
    • TODO: Decimal, FixedList, Tensor, Union

Canonical/Flat Encodings

  • Vortex, Apache Arrow ile zero-copy olacak şekilde tasarlanmış "Flat" encoding'leri varsayılan olarak içerir. Bunlar her mantıksal veri tipinin kanonik gösterimidir. Şu anda desteklenen kanonik encoding'ler:
    • Null
    • Bool
    • Primitive (Integer, Float)
    • Struct
    • VarBin (Binary, UTF8)
    • VarBinView (Binary, UTF8)
    • Extension
    • Daha fazla encoding eklenecek

Compressed Encodings

  • Vortex, yüksek derecede veri paralelliği sağlayan ve vektörleştirilmiş bir encoding kümesi içerir. Bu encoding'lerin her biri sıkıştırılmış bellek içi dizi uygulamalarına karşılık gelir ve açmanın ertelenmesini mümkün kılar. Şu anda şu encoding'ler vardır:
    • Adaptive Lossless Floating Point (ALP)
    • BitPacked (FastLanes)
    • Constant
    • Chunked
    • Delta (FastLanes)
    • Dictionary
    • Fast Static Symbol Table (FSST)
    • Frame-of-Reference
    • Run-end Encoding
    • RoaringUInt
    • RoaringBool
    • Sparse
    • ZigZag
    • Daha fazla encoding eklenecek

Compression

  • Vortex'in varsayılan sıkıştırma stratejisi BtrBlocks makalesine dayanır
    • Kabaca, her veri parçası için en az yaklaşık %1'lik bir veri örneği alınır
    • Ardından hafif encoding kümeleriyle (özyinelemeli olarak) sıkıştırma denenir
    • İçlerinden en iyi performans gösteren encoding kombinasyonu seçilerek tüm parça encode edilir
    • Bu çok maliyetliymiş gibi görünse de, yalnızca parçaya ait temel istatistiklerle birçok encoding düşük maliyetle elenebilir ve arama alanının patlayarak büyümesi önlenebilir

Compute

  • Vortex, her encoding'in hesaplama fonksiyonlarının uygulamasını özelleştirerek mümkün olduğunca açmayı önlemesini sağlar. Örneğin, dictionary encoding'li bir UTF8 dizisini filtrelerken önce sözlüğü filtrelemek daha ucuzdur
  • Vortex, verimli tarama ve pushdown için gerekebilecek temel hesaplama işlemlerini uygular; tam teşekküllü bir hesaplama motoru olmayı amaçlamaz

Statistics

  • Vortex dizileri gecikmeli hesaplanan özet istatistiklere sahiptir
  • Diğer dizi kütüphanelerinin aksine, bu istatistikler Parquet gibi disk formatlarından doldurulabilir ve hesaplama motoruna kadar korunabilir
  • İstatistikler hesaplama kernel'lerinde ve compressor'larda kullanılabilir
  • Mevcut istatistikler:
    • BitWidthFreq
    • TrailingZeroFreq
    • IsConstant
    • IsSorted
    • IsStrictSorted
    • Max
    • Min
    • RunCount
    • TrueCount
    • NullCount

Serialization / Deserialization (Serde)

  • vortex-serde uygulamasının hedefleri:
    • Zero-copy ve zero heap allocation ile taramayı desteklemek (sütun projeksiyonu + satır filtreleme)
    • Sabit zaman veya sabite yakın zamanda rastgele erişimi desteklemek
    • Sıralı olup olmama gibi istatistik bilgilerini tüketiciye aktarmak
    • Süreçler arasında dizi göndermek için IPC formatı sağlamak
    • Diskte veya object storage üzerinde sütunlu veriyi saklamak için genişletilebilir ve sınıfının en iyisi bir dosya formatı sunmak

Apache Arrow ile entegrasyon

  • Apache Arrow, sütunlu dizi verilerinde birlikte çalışabilirlik için fiili standarttır. Bu nedenle Vortex doğal olarak Apache Arrow ile mümkün olduğunca uyumlu olacak şekilde tasarlanmıştır
  • Tüm Arrow dizileri zero-copy ile Vortex dizilerine dönüştürülebilir. Arrow dizilerinden oluşturulan Vortex dizileri de yeniden zero-copy ile Arrow'a dönüştürülebilir
  • Vortex ile Arrow'un farklı ama birbirini tamamlayan hedeflere sahip olduğunu unutmamak gerekir
  • Vortex, mantıksal tipler ile fiziksel encoding'leri açıkça ayırarak Arrow'dan ayrılır. Bu sayede Vortex, mantıksal arayüzü korurken daha karmaşık dizileri modelleyebilir
    • Örn: Vortex, ilk parçası run-length encoding'li, ikinci parçası ise dictionary encoding'li UTF8 olan bir ChunkedArray modelleyebilir. Arrow'da RunLengthArray ile DictionaryArray uyumsuz ayrı tipler olduğundan bu şekilde birleştirilemez

Henüz yorum yok.

Henüz yorum yok.