- "The LLVM of columnar file formats"
- 圧縮されたApache Arrow配列をメモリ、ディスク、ネットワーク越しに扱うためのツールキットを含むColumnar形式のファイルフォーマット
- Apache Parquetの野心的な後継として、100〜200倍高速なランダムアクセス読み取りと2〜10倍高速なスキャンをサポートしつつ、zstdを使用したParquetとほぼ同等の圧縮率と書き込みスループットを維持
- 非常に大きなテーブル(数万カラム)とGPU上での伸長にも対応
- Vortexは、Columnarファイル形式に対してApache DataFusionがクエリエンジンに提供するのと同様の役割を果たすよう設計されている
- つまり、高い拡張性、非常に高速な性能、バッテリー同梱型の機能が特徴
> [!注意] > まだ活発に開発中
- 主な機能:
- Logical Types - 物理レイアウトについていかなる前提も置かないスキーマ定義
- Zero-Copy to Arrow - 正規化(canonicalized)されたVortex配列はApache Arrow配列へゼロコピー変換が可能
- Extensible Encodings - プラグイン方式の物理レイアウト集合。Arrow互換エンコーディングに加え、最新のエンコーディング(FastLanes、ALP、FSSTなど)も拡張として提供
- Cascading Compression - データを複数のネストされたエンコーディングで再帰的に圧縮可能
- Pluggable Compression Strategies - 組み込みCompressorはBtrBlocksベースだが、他の戦略も容易に利用可能
- Compute - エンコード済みデータ上で動作する基本計算カーネル(例: フィルタープッシュダウン)
- Statistics - 各配列は読み取り時に選択的に計算される要約統計を持つ。計算カーネルと圧縮器で利用可能
- Serialization - IPCとファイルフォーマット向けの配列のゼロコピーシリアライズ
- Columnar File Format (進行中) - Vortex serdeライブラリを使って圧縮済み配列データを保存するモダンなファイルフォーマット。ランダムアクセス読み取りと非常に高速なスキャンに最適化。Apache Parquetの後継を目指す
概要: Logical vs Physical
- Vortexの中核設計原則の1つは、論理的関心事と物理的関心事を厳密に分離すること
- 例: Vortex配列は、論理データ型(スカラー要素の型)と物理エンコーディング(配列自体の型)で定義される
- 組み込みエンコーディングは主にApache Arrowのインメモリフォーマットをモデル化するために設計されている。また、他のエンコーディングの有用な構成要素として使われる組み込みエンコーディング(
sparse、chunked)もある。拡張エンコーディングは主に、長さエンコーディングや辞書エンコーディングのような圧縮済みインメモリ配列をモデル化するためのもの
vortex-serdeは、Vortex配列の低レベルな物理的詳細を扱うように設計されている。どのエンコーディングを使うか、またデータを論理的にどうチャンク化するかはCompressor実装に委ねられる
- (開発中の)Vortexファイルフォーマットの独特な特性の1つは、データの物理レイアウトをファイルのフッターにエンコードする点にある。これにより、ファイルフォーマットは実質的に自己記述的となり、ファイルフォーマット仕様の互換性を壊さずに進化できる
- 前方互換性をサポートするため、WASMデコーダをファイル自体に任意で埋め込めるよう設計されている。これにより、他のColumnarファイルフォーマットを悩ませてきた急速な硬直化を避ける助けになる
構成要素
Logical Types
- Vortexの型システムはまだ変化の途中にある。現在の論理型:
- Null
- Bool
- Integer(8, 16, 32, 64)
- Float(16, b16, 32, 64)
- Binary
- UTF8
- Struct
- List(部分実装)
- Date/Time/DateTime/Duration(拡張型として実装)
- TODO: Decimal, FixedList, Tensor, Union
Canonical/Flat Encodings
- Vortexは、Apache Arrowとのゼロコピーを実現するよう設計された"Flat"エンコーディングを標準で含んでいる。これらは各論理データ型の正規表現である。現在サポートされている正規エンコーディング:
- Null
- Bool
- Primitive (Integer, Float)
- Struct
- VarBin (Binary, UTF8)
- VarBinView (Binary, UTF8)
- Extension
- 今後さらに多くのエンコーディングを追加予定
Compressed Encodings
- Vortexは、高度にデータ並列でベクトル化されたエンコーディング群を含む。これらのエンコーディングはそれぞれ圧縮済みインメモリ配列実装に対応しており、伸長を遅延させることができる。現在は次のようなエンコーディングがある:
- 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
- 今後さらに多くのエンコーディングを追加予定
Compression
- Vortexの基本圧縮戦略はBtrBlocks論文に基づいている
- おおまかには、各データチャンクについて最低でも約1%のデータをサンプリングする
- その後、軽量なエンコーディング集合で(再帰的に)圧縮を試みる
- その中で最も性能の高いエンコーディングの組み合わせを選び、チャンク全体をエンコードする
- これは非常にコストが高そうに聞こえるが、チャンクに関する基本統計があれば多くのエンコーディングを低コストで枝刈りできるため、探索空間が爆発的に大きくなるのを防げる
Compute
- Vortexは、各エンコーディングが計算関数の実装を特化することで、可能な限り伸長を避けられる仕組みを提供する。たとえば、辞書エンコードされたUTF8配列のフィルタリングでは、まず辞書をフィルタする方が低コスト
- Vortexは、効率的なスキャンやプッシュダウンに必要となる基本的な計算演算を実装するが、完全な計算エンジンを目指しているわけではない
Statistics
- Vortex配列は遅延評価される要約統計を持つ
- 他の配列ライブラリと異なり、この統計はParquetのようなディスクフォーマットから埋め込まれた状態で計算エンジンまでそのまま保持できる
- 統計は計算カーネルと圧縮器で利用可能
- 現在の統計:
- BitWidthFreq
- TrailingZeroFreq
- IsConstant
- IsSorted
- IsStrictSorted
- Max
- Min
- RunCount
- TrueCount
- NullCount
Serialization / Deserialization (Serde)
vortex-serde実装の目標:
- ゼロコピーかつヒープ割り当てゼロでスキャン(カラムプロジェクション + 行フィルタリング)をサポート
- 定数時間または準定数時間でランダムアクセスをサポート
- ソート済みかどうかといった統計情報をコンシューマーに伝達
- プロセス間で配列を送るためのIPCフォーマットを提供
- ディスクやオブジェクトストレージにColumnarデータを保存するための、拡張可能で最高水準のファイルフォーマットを提供
Apache Arrowとの統合
- Apache Arrowは、Columnar配列データの相互運用における事実上の標準である。したがってVortexは、Apache Arrowと最大限互換になるよう設計されている
- すべてのArrow配列はゼロコピーでVortex配列に変換できる。Arrow配列から生成されたVortex配列は、再びゼロコピーでArrowへ変換できる
- VortexとArrowは異なるが相互補完的な目標を持っている点に注意が必要
- Vortexは、論理型と物理エンコーディングを明示的に区別することでArrowと差別化されている。これによりVortexは、より複雑な配列をモデル化しつつ論理インターフェースを公開できる
- 例: Vortexは、最初のチャンクがランレングスエンコーディングされ、2番目のチャンクが辞書エンコードされたUTF8
ChunkedArrayをモデル化できる。ArrowではRunLengthArrayとDictionaryArrayは互換性のない別個の型であるため、このように組み合わせることはできない
まだコメントはありません。