効率的なデータ重複排除のための Parquet コンテンツ定義チャンク

Parquet コンテンツ定義チャンク (CDC) が PyArrow と Pandas で利用可能になり、Hugging Face の Xet ストレージ層などのコンテンツアドレス可能ストレージシステム上で Parquet ファイルの効率的な重複排除を実現します。変更されたデータチャンクのみをアップロードまたはダウンロードすることで、CDC は大規模データセットのデータ転送量とストレージコストを劇的に削減します。

Xet と CDC を用いた Parquet ストレージの最適化

Hugging Face は 4 PB 以上の Parquet ファイルをホストしています。このストレージを最適化するために、Hugging Face は Xet ストレージ層を導入しました。Xet はコンテンツ定義チャンクを使用してデータチャンクを重複排除し、転送速度を向上させます。

Xet はフォーマットに依存しませんが、標準的な Apache Parquet のレイアウトとカラムチャンク圧縮は、データにわずかな変更が加えられた場合でも、全く異なるバイトレベルの表現を生成することがよくあります。これにより、重複排除が最適でなくなります。Parquet CDC は、シリアライズや圧縮が行われる前に、論理的な内容に基づいてカラムをデータページ単位でチャンク化することで、類似データセット間のバイトレベルの差異を最小限に抑え、問題を解決します。

実装と使用方法

ユーザーは PyArrow または Pandas で use_content_defined_chunking=True 引数を渡すことで Parquet CDC を有効にできます。

PyArrow:

import pyarrow.parquet as pq
pq.write_table(table, "hf://datasets/{user}/{repo}/path.parquet", use_content_defined_chunking=True)

Pandas:

import pandas as pd
df.to_parquet("hf://datasets/{user}/{repo}/path.parquet", use_content_defined_chunking=True)

一般的なデータワークフローにおけるパフォーマンス

Parquet CDC は Xet ストレージ層と併用することで、いくつかの一般的なデータエンジニアリングシナリオにおいて大幅な重複排除効果を提供します。

完全コピーとカラムの変更

  • 完全コピー: 同一ファイルを別のリポジトリにアップロードすると、システムがコンテンツが既に存在することを認識するため、瞬時に完了します。
  • カラムの追加/削除: 新しいカラムと更新されたフッターメタデータのみが転送されます。例として、データセットに新しいカラムを追加した場合、96.6MB のファイルに対して 575kB の新データのみがアップロードされました。
  • カラム型の変更: カラムをキャスト(例: int64 から int32)する場合、変更されたカラムと更新されたメタデータのみをアップロードすれば済みます。

行レベルの操作

  • 行の追加: テーブルに新しい行を連結すると、新しいデータだけが転送されます。元の行はストレージ層で変更されません。
  • 行の挿入と削除: 標準的な Parquet では、行を挿入または削除するとそれ以降のすべての行がシフトし、続くデータページのバイトレベル表現が変わり、完全な再アップロードが必要になります。Parquet CDC はコンテンツに基づいてチャンク化することでこれを防ぎ、システムが特定の変更のみを識別して転送できるようにします。テストでは、データセットに行を挿入した際の転送量が約 90MB(標準)から 6MB(CDC)に削減されました。

構造とシャーディングの変更

  • 行グループサイズ: 行グループサイズを変更(例: 1M 行から 128k または 256k)すると、通常はデータページ間の値がシフトします。Parquet CDC はこれらの構造的変更があっても重複排除効率を維持します。
  • ファイルレベルの分割: データセットを異なる数のシャード(例: 5、10、20)に分割した場合でも、Parquet CDC と Xet を組み合わせることで、全体のアップロードサイズは元のデータセットとほぼ同じままです。

制限事項と考慮点

Parquet CDC はデータページ(カラムチャンク)レベルで動作するため、その有効性は変更の選択性に依存します。フィルタや変更がデータセット全体の大部分のデータページに影響を与える場合、ユニークなチャンクが増えるため、重複排除率は低下します。

Sources