9 ポイント 投稿者 GN⁺ 2025-10-03 | 1件のコメント | WhatsAppで共有
  • F3(Future-proof File Format) は、相互運用性・拡張性・効率性を中核の設計原則とする次世代のオープンソース列指向ストレージフォーマットであり、データ処理やコンピューティング環境が変化するたびに新しいフォーマットを作る必要をなくす
  • 各 F3 ファイルは 自己記述的(self-describing) な構造を持ち、データとメタデータはもちろん、WebAssembly(Wasm) バイナリデコーダ まで内蔵しているため、ネイティブデコーダがなくてもあらゆるプラットフォームで互換性を保証
  • 段階的圧縮やベクトル化デコーディングなどの最新エンコーディング手法を含む 効率的なストレージレイアウト を提供し、Parquet と ORC のレイアウト上の問題点を改善して、I/O・エンコーディング・辞書単位を分離
  • プラグインベースのデコーディング API と Wasm 埋め込みメカニズムにより、開発者は新しいエンコーディングスキームを容易に追加でき、ライブラリのバージョンに関係なくすべてのファイルを読み取れるため、Parquet の相互運用性の問題を解決
  • 評価の結果、F3 のストレージレイアウト効率と Wasm ベースのデコーディングの利点が実証され、ストレージオーバーヘッドはキロバイト級とごく小さく、Wasm デコーディングの性能低下はネイティブ比で 10〜30% と許容可能な水準

背景と動機

既存の列指向フォーマットの限界

  • ParquetORC は 2010 年代初頭に Hive、Impala、Spark のようなデータ分析システム向けに開発され、データウェアハウスとデータレイク間でのデータ共有を可能にした
  • 10 年が経過した現在、研究ではこれらのフォーマットが現代のデータ分析には不十分であることが示されており、その理由は設計当時の 古いハードウェア性能の前提ワークロードのアクセスパターンの前提 に基づいていたため
    • この 10 年でストレージとネットワーク性能は数十倍向上した一方で CPU 性能はそれほど伸びておらず、システムは I/O ではなく 計算側でボトルネック が発生
    • データレイクの台頭により、より多くのデータが高帯域幅・高遅延のクラウドストレージ(例: Amazon S3)に保存されるようになった
    • アプリケーションはもはや少数のカラムを持つ表形式データだけを保存するわけではない。ML ワークロードでは、数千のカラム を持つ幅広いテーブル、高次元ベクトル埋め込み、大容量 blob(画像、動画)などを保存することが一般的
    • ランダムアクセスや更新を行いたいという要求も増えているが、既存フォーマットはこうした利用パターンに適していない
  • 近年の圧縮・インデックス・フィルタリング手法の進歩がこれらの欠点を解決しようとしているものの、既存のファイルフォーマットは容易に拡張できるよう設計されていない
    • 新機能を追加しても、Parquet や ORC ライブラリには多様な言語実装が多すぎて、最新バージョンの利用を期待しにくい
    • 古いライブラリを使うシステムは新しいファイル内容をデコードできない可能性があり、そのため多くのシステムは 最小公倍数的な機能だけをサポート して相互運用性の問題を回避している

新しいファイルフォーマットの登場と限界

  • これを克服するため、Meta Nimble、Lance、TSFile、Bullion、BtrBlocks など、まったく新しいファイルフォーマットの提案が登場
  • しかし、これらも前世代のフォーマットと 同じ過ち を犯している
    • 現代のハードウェアおよびワークロードの前提に基づいて設計されている
    • 新機能をサポートしつつ既存デプロイメントとの相互運用性を壊さない 容易な拡張性を促進できていない
    • このうちの 1 つが Parquet や ORC を置き換える主要フォーマットになったとしても、10 年後にはその欠点を解決するためにまた別のフォーマットを作らなければならないという同じ問題が発生する

F3 のアプローチ

  • F3 は 相互運用性・拡張性・効率性 を同時に達成することを目標とする
  • F3 の中核は次の 3 つの仕様定義にある:
    1. ファイル内容の メタデータ
    2. ファイル内のエンコード済みデータの 物理的グルーピングレイアウト
    3. データのエンコーディングスキームに依存しない データアクセス API
  • F3 のメタデータスキームは、テーブルのカラム部分集合を取得するのに必要なデータを最小化する
  • F3 は Parquet の包括的な "row group" 概念をなくし、I/O・エンコーディング・辞書単位を分離 してレイアウトの問題を解決
  • 段階的圧縮ベクトル化デコーディング のような最新手法を統合

F3 概要

全体構造

  • F3 ファイルは メタデータ部分データ部分 で構成される
    • メタデータ部分: OptionalData(OptData)、Column Metadata(ColMetadata)、Footer、Postscript
    • データ部分: Row Groups(RG) で構成され、実データを含む
  • F3 は Parquet および ORC と同じ PAX レイアウト を採用
  • ただし F3 には既存フォーマットとの間にいくつかの重要な違いがある:
    1. メタデータが デシリアライズのオーバーヘッドを除去(Parquet/ORC の問題点を解決)
    2. 物理 I/O Unit(IOUnit) を論理的 row group から分離し、ストレージ媒体に応じて IOUnit サイズを独立して調整可能
    3. 辞書エンコーディング範囲 を論理的 row group から分離し、各カラムごとに最も効果的な範囲を決定可能
    4. 各 IOUnit は複数の Encoding Unit(EncUnit) で構成され、EncUnit はエンコーディングおよびデコーディングの最小単位

相互運用性と拡張性のメカニズム

  • F3 は 公開 API を提供し、実装がファイル内の圧縮データをどのようにデコードするかを定義する
  • エンコーディング方式を プラグイン として扱い、コアライブラリとは別にインストールおよびアップグレード可能
  • すべてのライブラリバージョンがすべてのファイルを読めるように、WebAssembly(Wasm) バイナリとして実装したデコーダをファイル内部に埋め込む
    • つまり、すべての F3 ファイルにはデータと、そのデータを読むコードの両方が含まれる
  • F3 の API はネイティブコード版と Wasm 版で別実装を必要とせず、同じコードを変更なしで 2 つのターゲットにコンパイルできる
  • この設計により F3 は将来に備えたものとなり、前述の問題を回避し、既存ソリューションよりも速い進化を可能にする
    • 開発者はフリート全体でのライブラリバージョン更新を心配することなく、Wasm コードをファイルに含めることで将来のエンコーディング方式を本番システムへ展開できる
    • Wasm バイナリのストレージオーバーヘッドはごく小さく(キロバイト級)、ネイティブ実装と比べた Wasm デコーディングの性能低下も最小限(10〜30%)

結論

  • F3 は 相互運用性・拡張性・効率性 を同時に達成する次世代の列指向ファイルフォーマット
  • 効率的なファイルレイアウト設計により既存フォーマットの非効率を解消
  • プラグインベースのデコーディング APIWasm 埋め込み により、ライブラリバージョンに関係なくすべてのファイルを読める将来保証のメカニズムを提供
  • プロトタイプ評価の結果、レイアウト設計の効率性と Wasm メカニズムの実用性が実証された
  • Wasm オーバーヘッドはキロバイト級のストレージ使用量と 10〜30% の性能低下にとどまり、許容可能な範囲

1件のコメント

 
GN⁺ 2025-10-03
Hacker Newsの意見
  • ざっと見た感じ、Parquetの欠点をかなり補っているようで、とても期待できる

    • ParquetのメタデータはThriftベースなのに、「このフィールドがあればあのフィールドも必須」といった注釈があるだけで実際の検証ロジックがなく、不正なThriftを入れるとリーダーが壊れるだろうと思う

    • Parquetのメタデータはパースが必要なので、バッファ割り当てやメタデータ解析のための動的割り当てが繰り返され、ヒープ割り当てが多すぎる。今回のフォーマットはFlatbuffers方式を採用しており、Flatbufferバイト列をそのまま解釈できるのでこの問題が解消される

    • エンコーディングがはるかに強力だと感じる。データベース業界で昔から提唱されてきた軽量で組み合わせ可能なエンコーディングが可能になったようだ。BtrBlocksやFastLanesのような既存フォーマットはParquetより優れていたが、彼らの良いアイデアが継承されていてうれしい

    • ParquetのDremel record-shreddingは複雑すぎて好きではなかったが、今回はなくなっていてよかった

    • ParquetではDataPage内のrow数が一定でないため、欲しいrowを見つけるにはColumnChunk全体をスキャンしなければならないが、このフォーマットでは目的のDataPage(IOUnit)へ直接ジャンプできる

    • 重い圧縮は取り除き、Delta/Dictionary/RLEだけを残した。重い圧縮は実質的な利得がなく、実装も面倒で、外部依存も多い

    • 全体として大きな前進だ。このフォーマットがデータ分析業界を席巻してほしい

    • 重い圧縮がzstdやbrotliのことなら、繰り返しの少ない文字列カラムではとても有用だ

      • 実際、ほとんどがASCIIで共通部分文字列が多く、圧縮率が1%まで出た経験がある
    • wasmコンパイラが入ると、むしろ「heavy」compressionより多くの依存関係が増える可能性がある

      • 以前はCPU資源がネットワークやディスク帯域より比較的豊富だったので重い圧縮に意味があったが、今はその差が小さい
    • Parquetファイルへのカラム追加に関するStackOverflowの議論

    • 最近の圧縮方式はzstdに落ち着いた感じなのだろうか?

    • Parquetは意外と複雑だ。きちんと効率よく使うには、不便で文書化も不十分な細部を多く把握しなければならず、簡単ではない

  • Wes McKinney

    • Wes McKinneyを知らない人のために言うと、彼はPythonで最も広く使われている表形式分析ライブラリPandasの作者だ

    • 彼が作ったフォーマットはリリース初期から市場の信頼を得やすく、また問題に長年愛着を持って取り組んできたため、彼の洞察は特に重要視される

    • Andy Pavloも言及する価値が大きい

      • 彼はデータベース分野の専門家で、データ中心の人生を送っていることで有名だ
      • 彼の"What goes around comes around"という2本の論文を参照すると、データベース分野の過去と未来を見渡しやすい
      • CMU Seminar Seriesも素晴らしく、彼が関わっていることでさらに期待できる
      • 中国人の共同著者たちについてはよく知らず申し訳なく思うが、この論文はブックマークして丁寧に読むつもりだ
    • Pandasの影響力についてはファンとして同意するが、技術的にはArrowデータフォーマットのほうがデータエコシステム全体により大きな影響を与えたと思う(例としてDataFusionなど)

      • いまやF3の正体が何なのか確認してみたくなった(あなたのおかげでリンクをクリックした)
    • Wes McKinneyはApache Arrowの創始者でもある

      • 現代データ分析の中核コンポーネントだ
    • Parquetに対する彼の仕事が、むしろいっそう信頼感を与えると思う

    • データとコードを混在させるのは古典的なセキュリティミスだ

      • 有名人が参加してもミスが消えるわけではない
  • 物理学者たちの未来には適用されない気がする

  • カラム指向ストレージとの違いをよく理解できていない点についてはご容赦願いたい

    • なぜこれが革新的なのか気になるのだが、「小さなベクトル埋め込みデータベースをサンドボックス付きで配布できるのが核心なのか?」という疑問がある

    • 論文から新たな基盤になりそうな印象を受け、プロジェクト名にもフランス風のオーラ(?)を感じた

    • 自分は内容の大半を理解できていないが、図や色使いはきれいで大胆だと思った。すぐ説得されるタイプの自分としては親指を2本立てたい

    • 核心は互換レイヤーだ

      • たとえばORCv2は新しいフォーマットバージョンを作って機能を段階的に展開しようとしたが、結局リリースできなかった
      • もし新しいfloatエンコーディングをWASM shim付きでファイルとして配布できていれば、読み取りソフトの更新や互換性問題なしに新しいフォーマットを簡単に届けられたはずだ
      • Sparkのvariant型のように複雑な再構成が必要な場合でも、インタプリタではなくバイトコードとして渡せばずっと容易になる
      • 個人的にはORCのチューニングで徹夜しつつ、ベンチでよく持ちこたえてくれるのを見て誇らしかった
    • カラムストレージ方式の本当の利点は、複雑なネストしたスキーマをprimitive値に分解して保存できることだ

      • leaf値を直接読み取れるので、I/Oとパース効率が大幅に上がる
      • フォーマットは最上位レベルでrow group単位にパーティショニングされる
      • 今回のフォーマットはApache Arrowバッファをデータページから直接受け取れるようにしている(WASM利用でもネイティブデコーダでも)
      • Parquetは現在とても複雑だ。Dremelエンコーディングを使い、primitive値を2つの整数ストリーム(repetition/definition level)と一緒に保存するため、一般の人にはパースが難しい
      • 特にbit-packing+RLEが混在しており、リファレンス実装だけでもbit-packingコードが7万4千行ある
      • Arrowバッファへ変換するにはかなりの作業が必要だ。F3ならずっと簡単で将来互換性も高いだろう
      • さらに、メタデータにランダムアクセスできる点も大きい
      • 例として、GeoParquet使用時にSQLiteインデックスを張らないと、空間クエリ1回に平均10分かかり、500ファイルのfooterパースに150MBのThriftパースが必要になる
      • Flatbuffersの採用は意外だ。Flatbuffersのメモリ安全性の問題は知られている(関連指摘
      • むしろSQLiteデータベースを埋め込むほうが良いのではないかと思う
    • カラム指向ストレージの本当の利点は、列全体を一度に非常に高速でスキャンできることにある

      • OSバッファを非常に効率よく使える。たとえば select a where b = 'x' のクエリが非常に速くなる
  • wasmデコーダがネイティブ比で10〜30%遅いのはかなり残念だ

    • つまり最初から10〜30%の性能低下を受け入れるということであり、今後デコーダを改善する機会も永久に放棄することになる

    • 「ブロック全体をデコードしてメモリに格納する」以外の高度なデコーディング機能も使えなくなる

    • なぜわざわざこう作るのか本当に理解できない

    • 速度が重要ならwasmは答えではないし、速度がそれほどでもないならよく知られたエンコーディングを使えばよいはずだ

    • WASMはバックアップ用途として提供される

      • ネイティブデコーダ(たとえばcrate)がインストールされていればそちらを優先して使い、なければWASMにフォールバックする
      • 10〜30%の損失を受け入れるのは、ファイルをまったく読めないよりはましだという立場だ
    • 同意できる点もあるが、話はもう少し複雑だ

      • すでにさまざまな圧縮方法を使う場合にも似た状況が繰り返されている
      • たとえばbitpack方式や圧縮変更のたびに「トランスコーディング」、つまりファイル再書き込みが必要になる
      • WASM導入後も同様にファイル再書き込みは必要だ
      • 将来性の確保がそれだけの価値を持つのかは疑問だ。エクサバイト規模のシステムでデータ再エンコードは本当に大変だ
  • VortexとF3の関係が正確には理解できない

    • どちらも「新しいフォーマットを作らなくてもエンコーディング方式を容易に追加できるよう設計する」というビジョンを語っている

    • 紹介文にはVortexのエンコーディング実装を使うとあるが、型システムは異なるとも書かれている

    • プロジェクトがこう進んだ背景は複雑だ

      • 当初はCMU、Tsinghua、Meta、CWI、VoltronData、Nvidia、SpiralDBがコンソーシアムを組み、単一のファイルフォーマットに統合しようとしていた
      • しかしMetaのNDA(秘密保持契約)に関するCMU側弁護士の問題で頓挫した
      • そのため全員がそれぞれ独自にファイルフォーマットをリリースした
      • 研究面ではCMU+Tsinghuaはエンコーダ開発よりWASM埋め込みに集中した
      • DuckDBのHannesがWes McKinneyに最初のアイデアを提案した
      • Vortexのエンコーディング実装はRustベースなので、手を入れれば大半をWASMにコンパイルできる
      • VortexはF3とは別の独立プロジェクトで、F3は現在学術向けのプロトタイプだ
      • ドイツでも今年、別のWASM活用フォーマットが公開された: AnyBloxフォーマット(ファイル全体をWASM化する。F3はカラムグループ単位)
  • 来年のF4発表にも期待してしまう

  • ソースコードがどこにあるのかしばらく探したが、ここで公開されている

  • データを読むには必ずwebassemblyを実行しなければならないという義務が生じるので、依存関係や肥大化を減らしたい環境には向かないと思う

    • wasmは単純だ

      • "web"とは別物だ
      • 他の人が言ったように、wasmはバックアップだ
      • ネイティブコーディング(binding)を提供すれば性能はさらに良くなる
    • ネイティブデコーダがあるならWASMを使う必要はない

      • この点は要旨にも明確に書かれている
  • WebAssemblyモジュールを埋め込んだ最初期のファイルフォーマットの一つのようだ

    • 圧縮の観点で特に興味がある。WASMプリプロセッサをうまく設計すれば圧縮率を大きく改善できるという立場だ

    • 私もこのコンセプトでファイルフォーマットを作っている

    • Alan Kayは、60年代にあるプログラマが作ったとされるテープベースの保存システムを「最初のオブジェクト指向システム」と説明したことがある

      • そのテープのフォーマットには、特定位置の読み書きルーチン一式が含まれていた
      • つまり先行事例がある
      • 関連論文リンク(4ページ)