メインコンテンツまでスキップ
バージョン: 2.1

カラム圧縮

Dorisは、データの整理と保存にcolumnar storageモデルを採用しており、これは分析ワークロードに特に適しており、クエリ効率を大幅に向上させることができます。columnar storageでは、Tableの各カラムが独立して保存され、圧縮技術の適用を促進し、ストレージ効率を向上させます。Dorisは様々な圧縮アルゴリズムを提供しており、ユーザーはワークロード要件に基づいて適切な圧縮方法を選択し、ストレージとクエリパフォーマンスを最適化することができます。

圧縮が必要な理由

Dorisにおいて、データ圧縮には主に以下の2つの中核的な目的があります:

  1. ストレージ効率の向上 圧縮により、データストレージに必要なディスク容量を大幅に削減でき、同じ物理リソースでより多くのデータを保存できます。

  2. パフォーマンスの最適化 圧縮されたデータの容量は小さく、クエリ時に必要なI/O操作が少なくなるため、クエリ応答時間が高速化されます。現代の圧縮アルゴリズムは通常、非常に高速な解凍速度を持ち、ストレージ容量を削減しながら読み取り効率を向上させることができます。

サポートされている圧縮アルゴリズム

Dorisは様々な圧縮アルゴリズムをサポートしており、それぞれが圧縮率と解凍速度の間で異なるトレードオフを持ち、ユーザーはニーズに基づいて適切なアルゴリズムを選択できます:

Compression タイプ特徴適用シナリオ
No Compression- データに圧縮を適用しません。データがすでに圧縮されている場合やストレージ容量が問題でない場合など、圧縮が不要なシナリオに適しています。
LZ4- 非常に高速な圧縮・解凍速度。
- 中程度の圧縮率。
リアルタイムクエリや高並行負荷など、解凍速度要件が高いシナリオに適しています。
LZ4F (LZ4 Frame)- より柔軟な圧縮設定をサポートするLZ4の拡張版。
- 高速で中程度の圧縮率。
設定の細かい制御を伴う高速圧縮が必要な場合に必要です。
LZ4HC (LZ4 High Compression)- LZ4と比較してより高い圧縮率ですが、圧縮速度は遅くなります。
- 解凍速度はLZ4と同等です。
より高い圧縮率が必要で、解凍速度に重点を置く場合に必要です。
ZSTD (Zstandard)- 柔軟な圧縮レベル調整を伴う高い圧縮率。
- 高い圧縮率でも解凍速度は高速を維持。
クエリパフォーマンスとのバランスを取りながら、高いストレージ効率が要求される場合に必要です。
Snappy- 高速解凍のために設計。
- 中程度の圧縮率。
高速解凍と低CPU負荷が要求されるシナリオに必要です。
Zlib- 圧縮率と速度の良いバランス。
- 他のアルゴリズムと比較して圧縮・解凍速度は遅いですが、圧縮率は高くなります。
アーカイブやコールドデータストレージなど、高いストレージ効率が要求され、解凍速度に敏感でないシナリオに必要です。

圧縮の原理

カラム圧縮 columnar storageの採用により、DorisはTable内の各カラムを独立して圧縮できます。この方法は、同一カラム内のデータが多くの場合、類似の分布特性を持つため、圧縮効率を向上させます。

圧縮前のエンコーディング データを圧縮する前に、Dorisはカラムデータをエンコード(例:dictionary encodingrun-length encodingなど)し、データを圧縮により適した形式に変換して、圧縮効率をさらに向上させます。

Page圧縮 Dorisはpageレベルの圧縮戦略を採用しています。各カラム内のデータは複数のページに分割され、各ページ内のデータが独立して圧縮されます。ページ単位で圧縮することにより、Dorisは高い圧縮率と解凍パフォーマンスを確保しながら、大規模データセットを効率的に処理できます。

設定可能な圧縮戦略 ユーザーは、Table作成時に使用する圧縮アルゴリズムを指定できます。この柔軟性により、ユーザーは特定のワークロードに基づいて、圧縮効率とパフォーマンスの間で最適な選択を行うことができます。

圧縮効果に影響する要因

異なる圧縮アルゴリズムがそれぞれの長所と短所を持つにもかかわらず、圧縮の効果は選択したアルゴリズムのみに依存するのではなく、以下の要因にも左右されます:

データの順序

データの順序は圧縮効果に大きな影響を与えます。高い連続性を持つカラム(例:タイムスタンプや連続する数値カラム)では、圧縮アルゴリズムは通常、より良い結果を達成できます。データの順序が規則的であるほど、圧縮時に圧縮アルゴリズムが識別できる反復パターンが多くなり、圧縮率が向上します。

データの冗長性

データカラム内の重複値が多いほど、圧縮効果は顕著になります。例えば、重複値にdictionary encodingを使用することで、ストレージ容量を大幅に削減できます。しかし、明らかな重複のないデータカラムでは、圧縮効果が期待を満たさない場合があります。

データ型

データの型も圧縮効果に影響を与えます。一般的に、数値データ型(整数や浮動小数点数など)は文字列データ型よりも圧縮しやすくなります。値の範囲が広いデータ型では、圧縮アルゴリズムの効果が影響を受ける可能性があります。

カラムの長さ

カラム内のデータの長さも圧縮効果に影響を与えます。短いカラムは通常、長いカラムよりも圧縮しやすくなります。これは、圧縮アルゴリズムが短いデータブロック内でより効率的に反復パターンを見つけることができるためです。

Null値

カラム内のnull値の割合が高い場合、圧縮アルゴリズムはより効果的になる可能性があります。これらのnull値を特別なパターンとしてエンコードし、ストレージ容量を削減できるためです。

適切な圧縮アルゴリズムの選択方法

適切な圧縮アルゴリズムの選択は、ワークロード特性に基づいて行うべきです:

  • 高性能リアルタイム分析シナリオでは、LZ4またはSnappyの使用を推奨します。
  • ストレージ効率を優先するシナリオでは、ZSTDまたはZlibの使用を推奨します。
  • 速度と圧縮率のバランスを取る必要があるシナリオでは、LZ4Fを選択できます。
  • アーカイブやコールドデータストレージシナリオでは、ZlibまたはLZ4HCの使用を推奨します。

Dorisでの圧縮設定

Table作成時に圧縮アルゴリズムを指定して、データの保存方法を決定できます:

CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);