分析DBMSにおけるデータフォーマット:パフォーマンスのトレードオフと今後の展望
核心概念
Apache Arrow、Parquet、ORC のような一般的なオープンデータフォーマットは、分析DBMS に直接組み込む場合、それぞれにトレードオフがあり、DBMSでの使用に適したフォーマットは、データの特性やクエリワークロードによって異なる。
要約
分析DBMSにおけるデータフォーマット:パフォーマンスのトレードオフと今後の展望
Data Formats in Analytical DBMSs: Performance Trade-offs and Future Directions
この論文は、Apache Arrow、Parquet、ORC の3つの一般的なオープンカラムナーデータフォーマットを分析DBMSに直接組み込む場合の適合性を評価するものです。これらのフォーマットは、データレイクなどのストレージ層やOLAP DBMS間での相互運用性の向上とパフォーマンス向上を目的として提案されました。ParquetやORCはクラウド規模のデータウェアハウスシステムで広く採用されており、Apache Arrowは異なるデータシステム間での相互運用手段として広く認識されています。
しかし、これらのフォーマットは、共通のオープンフォーマットとして使用するために最適化された設計上の選択を行っており、これらの選択は従来の分析DBMSの技術と相反することがよくあります。例えば、DBMSのインメモリ カラムナーフォーマットは通常、スペースを最小限に抑え、メモリ要件を削減するためにデータをエンコードしますが、Apache Arrowはデフォルトではエンコードをサポートしておらず、典型的なDBMSの設計とは相容れません。一方、Parquetなどのオンディスクフォーマットは、データを最新の カラムナーDBMSに見られる形式に非常に近い形で配置しますが(例えば、ランレングスエンコーディングと辞書エンコーディングとビットパッキングを組み合わせるなど)、Parquetはストレージフォーマットとしてのみ広く活用されており、専用のインメモリ表現を公開していません。その結果、開発者はParquetデータをメモリに取り込み、Arrowフォーマットに変換する必要がありますが、これは前述のように、カラムナーDBMSにとっては最適ではありません。ORCは、効率的にエンコードされたデータフォーマットと関連するインメモリ表現の両方を提供するため、一見すると両方の長所を提供しているように見えます。しかし、ArrowとParquetは、オープンソースプロジェクトでの活動や、ビッグデータフレームワークや大規模クエリプロバイダーからのサポートという点で人気が高いため、今日では標準とされています。
Apache Arrow (Feather)
Apache Arrowは、効率的なインメモリコンピューティングをサポートするカラムナーデータ構造です。Arrowはフラットデータと階層データの両方を表現できます。Arrowは、ParquetやORCなどのオンディスクカラムナーデータフォーマットを補完するように設計されており、実際、図1に示されているのと同じ設計を共有しています。オンディスクデータファイルは解凍、デコードされ、Arrowインメモリ カラムナー配列にロードされます。各行バッチのデフォルトサイズは64K行です。Arrowカラムチャンクには、値がNULLかどうか(またはNULLでないか)を示す存在ビットベクトルと、文字列の場合はオプションで辞書があります。
Parquet
Parquetは、Google Dremelで概説されているネストデータストレージフォーマットにインスパイアされた、カラム指向のストレージフォーマットです。Parquetは、スペース効率を実現するために、多くの効率的な圧縮およびエンコードアプローチを統合しています。Parquetファイルは、セクション3.1で説明したように構造化されています。ただし、図2に示すように、各カラムチャンクは、辞書ページと一連のデータページに分割されます。そのファイルフッターには、行バッチ、チャンク化されたカラム、およびデータページレベルのゾーンマップ(最小値、最大値、NULLの数など)も含まれています。これにより、効率的なデータスキップが可能になります。行バッチの推奨サイズは512〜1024 MBです。Parquetは、データページごとに辞書エンコーディングを適用し、辞書が事前定義されたしきい値よりも大きくなった場合は、プレーンエンコーディングにフォールバックします。Parquetは、デコードのCPU使用率を犠牲にして、スペースとIOの効率を上げるように設計されています。インメモリコンピューティング用のデータ構造は提供していません。
ORC
Optimized Row Columnar(ORC)は、読み取りが多い分析ワークロード向けに設計されたストレージフォーマットです。ORCファイルは、デフォルトの行バッチサイズが250 MBである図1のように編成されています。Parquetとは異なり、図3に示すように、ORCはカラムを、最小値/最大値、ブルームフィルターなどを含むインデックスと、NULLエントリを示す存在ビットベクトルを持つ行データに編成します。行データ内のチャンク化されたカラムは、エンコードタイプに基づいてフォーマットされます。
ORCは、対応するインメモリフォーマットを公開しています。これには、高速なクエリとNULLチェックのための行レベルのインデックスとNULLビットベクトルデータ構造が含まれています。ORCは、文字列データの辞書エンコーディング(行バッチレベル)をサポートしています。Parquetと同様に、ORCは、異なる値の数がしきい値(Hiveの場合はレコードの80%など)を超えると、プレーンエンコーディングにフォールバックします。
深掘り質問
分析DBMS以外のシステムでは、これらのデータフォーマットはどのように評価されるのでしょうか?
分析DBMS以外のシステムでは、Arrow、Parquet、ORCの各データフォーマットは、それぞれの特性に基づいて異なる評価を受けます。
Apache Arrow
利点:
言語間でのデータ共有の容易さ: Python、Java、C++など、多くの言語でサポートされており、異なるシステム間でのデータ交換を効率化するのに役立ちます。
カラムナフォーマットによる効率的なデータ処理: 特にカラム単位の操作が得意なシステムにおいて、高いパフォーマンスを発揮します。
欠点:
圧縮とエンコードの機能が限定的: 分析DBMSでは重要な要素ですが、他のシステムでは重視されない場合があります。
データサイズが大きくなる可能性: 圧縮機能が限定的であるため、ストレージ容量の増加に繋がる可能性があります。
Parquet
利点:
高い圧縮率と効率的なストレージ: 特にストレージ容量が限られているシステムや、データの読み込み頻度が低いシステムにおいて有効です。
カラムナストレージによるクエリパフォーマンスの向上: 分析DBMSと同様に、カラム単位の操作が必要なシステムにおいても有効です。
欠点:
データの書き込みパフォーマンスが低い: 圧縮とエンコード処理のため、データの書き込みに時間がかかる場合があります。
データの更新や削除が苦手: データの変更操作には、ファイル全体を書き換える必要がある場合があります。
ORC
利点:
高度なインデックスとデータスキップ機能: 特に大規模なデータセットを扱うシステムにおいて、クエリのパフォーマンスを大幅に向上させます。
圧縮とエンコードのバランス: ストレージ効率とクエリパフォーマンスのバランスが取れています。
欠点:
ArrowやParquetと比較して、サポートする言語やシステムが少ない: 他のシステムとの連携において、制限となる可能性があります。
分析DBMS以外のシステムでは、これらのフォーマットを選択する際に、データサイズ、クエリパターン、システムの要件などを考慮する必要があります。
データの特性やクエリワークロードによっては、特定のユースケースでArrow、Parquet、ORCよりも優れたパフォーマンスを発揮する、あまり知られていないデータフォーマットは存在するのでしょうか?
はい、存在します。データの特性やクエリワークロードによっては、Arrow、Parquet、ORCよりも優れたパフォーマンスを発揮する、あまり知られていないデータフォーマットが存在します。
以下は、ユースケースとデータフォーマットの例です。
時系列データ: InfluxDB Line Protocol, Prometheus Exposition Format
ユースケース: 監視システム、IoTデータ分析
特徴: 時系列データに特化した圧縮、高速なデータ追加と集計に最適化
ログデータ: JSON Lines, Avro
ユースケース: アプリケーションログ分析、イベントストリーミング
特徴: スキーマの柔軟性、半構造化データの処理に適している
グラフデータ: GraphSON, RDF/XML
ユースケース: ソーシャルネットワーク分析、知識グラフ
特徴: ノードとエッジの関係性を表現するのに適している
地理空間データ: GeoJSON, Shapefile
ユースケース: 地図情報システム、位置情報分析
特徴: 地理空間データを効率的に表現、空間検索に最適化
これらのフォーマットは、特定のユースケースに特化して設計されており、データの圧縮率、クエリパフォーマンス、スキーマの柔軟性などの面で、Arrow、Parquet、ORCよりも優れたパフォーマンスを発揮する可能性があります。
将来、ハードウェアの進化は、分析DBMSにおけるデータフォーマットの設計と最適化にどのような影響を与えるでしょうか?
将来のハードウェアの進化は、分析DBMSにおけるデータフォーマットの設計と最適化に大きな影響を与えるでしょう。特に、以下の3つのトレンドが考えられます。
より高速で大容量なストレージの活用: NVMe SSDや、将来的には不揮発性メモリ(NVM)などの高速で大容量なストレージの普及により、データフォーマットは、より大きなブロックサイズや、より効率的なデータ配置を考慮した設計が必要になります。これにより、I/Oのボトルネックを軽減し、クエリのパフォーマンスを向上させることができます。
計算能力の向上とアクセラレーション: CPUのマルチコア化、GPUやFPGAなどのアクセラレータの進化により、データフォーマットは、並列処理やハードウェアアクセラレーションを最大限に活用できる設計が求められます。例えば、ベクトル化処理、SIMD命令、GPUでのデータ処理を考慮したデータレイアウトや圧縮アルゴリズムの採用などが考えられます。
メモリ容量の増加とデータ処理の融合: メモリの大容量化と、処理能力の高いメモリ(HBMなど)の登場により、分析DBMSは、より多くのデータをメモリ上に保持し、処理することが可能になります。これにより、データフォーマットは、メモリ内処理に最適化された設計、例えば、CPUキャッシュに効率的に載るデータ構造や、圧縮された状態でのデータ処理などが求められます。
これらのハードウェアの進化に対応するために、分析DBMSのデータフォーマットは、従来のストレージ中心の設計から、より計算能力の向上やメモリ内処理を意識した設計へと進化していくことが予想されます。