データ圧縮
Doris はデータを列指向ストレージモデルで整理・保存します。このモデルは分析ワークロードに特に適しています。同じ列のデータは分布特性が似ていることが多いため、列指向ストレージには圧縮しやすいという利点があります。Doris には複数の圧縮アルゴリズムが組み込まれており、テーブルの作成時にワークロードに適したものを選んで、ストレージコストとクエリ性能のバランスを調整できます。
圧縮アルゴリズムの選択ガイド
ワークロードによって圧縮に求められる特性は異なります。次の表に、一般的なシナリオで推奨される選択肢を示します。
| 利用シナリオ | 推奨アルゴリズム | 理由 |
|---|---|---|
| 高性能なリアルタイム分析、高い同時実行数のクエリ | LZ4、Snappy | 展開が非常に速く、CPU 負荷が低い |
| ストレージコストとクエリ性能のバランスを重視 | ZSTD、LZ4F | 高い圧縮率を保ちながら、高速に展開できる |
| ストレージ効率を優先し、クエリのレイテンシーは重視しない | ZSTD、Zlib | 圧縮率が最も高く、ディスク容量を節約できる |
| アーカイブやコールドデータの保存 | Zlib、LZ4HC | 圧縮率を最大化でき、アクセス頻度の低いデータに適している |
基本的には ZSTD を推奨します。多くのシナリオで、高い圧縮率と速い展開速度を両立できます。
圧縮が必要な理由
Doris でデータを圧縮する主な目的は、次の二つです。
- ストレージコストの削減:データの保存に必要なディスク容量を減らし、同じ物理リソースにより多くのデータを保存します。
- クエリ性能の向上:圧縮されたデータは占有容量が小さいため、クエリ実行時の I/O 回数を減らせます。最新の圧縮アルゴリズムは非常に高速に展開できるため、ストレージを節約しながらクエリの応答も速くできます。
サポートされる圧縮アルゴリズム
Doris は次の圧縮アルゴリズムをサポートします。アルゴリズムごとに、圧縮率と展開速度のバランスが異なります。
| 圧縮方式 | 特性 | 適用シナリオ |
|---|---|---|
| 圧縮なし | データを圧縮しません。 | データがすでに圧縮されている場合や、ストレージ容量がボトルネックにならない場合。 |
| LZ4 | 圧縮と展開が非常に速く、圧縮率は中程度です。 | リアルタイムクエリ、同時実行数の多いワークロードなど、高速な展開が必要な場合。 |
| LZ4F | LZ4 の拡張版で、圧縮設定をより柔軟に調整できます。速度が速く、圧縮率は中程度です。 | 設定を細かく制御しながら、高速に圧縮する必要がある場合。 |
| LZ4HC | LZ4 より圧縮率が高い一方で、圧縮速度は遅くなります。展開速度は LZ4 と同程度です。 | 展開速度を維持しつつ、より高い圧縮率が必要な場合。 |
| ZSTD(Zstandard) | 圧縮率が高く、圧縮レベルを柔軟に調整できます。高い圧縮率でも展開は高速です。 | 高いストレージ効率と良好なクエリ性能の両方が必要な場合。 |
| Snappy | 主に高速な展開を目的として設計されており、圧縮率は中程度です。 | 高速な展開が必要で、CPU リソースが限られている場合。 |
| Zlib | 圧縮率と速度のバランスが良好です。圧縮と展開は遅いものの、圧縮率は高くなります。 | アーカイブ、コールドデータの保存など、展開速度が重要でない場合。 |
圧縮の仕組み
Doris では、複数の処理層が連携して圧縮を実現します。
列単位の圧縮
Doris は列指向ストレージを使用するため、テーブルの各列を個別に圧縮します。同じ列のデータは分布特性が似ていることが多く、列単位の圧縮では行単位の圧縮より高い圧縮効率が得られます。
圧縮前のエンコーディング
Doris は圧縮前に列データをエンコードし、圧縮に適した形式に変換して圧縮率をさらに高めます。一般的なエンコーディング方式には、次のものがあります。
- 辞書エンコーディング:繰り返し現れる文字列を、短い辞書 ID に置き換えます。
- ランレングスエンコーディング(RLE):連続して繰り返される値を「値 + 繰り返し回数」で表します。
ページ単位の圧縮
Doris はページ単位で圧縮します。
- 各列のデータを複数のページに分割します。
- 各ページ内のデータを個別に圧縮します。
- クエリ時には対象のページだけを必要に応じて展開し、列全体のスキャンを避けます。
ページ単位の圧縮により、大規模なデータセットを効率的に扱いながら、圧縮率と展開性能のバランスを維持できます。
ストレージフォーマット V3 の最適化
Doris のストレージフォーマット V3 以降では、数値型のエンコーディング方式がさらに最適化されています。
- 整数型では、デフォルトで
PLAIN_ENCODINGを使用します。 - LZ4 または ZSTD による圧縮と組み合わせると、読み取りスループットが向上し、CPU 負荷が低下します。
詳細は、ストレージフォーマット V3を参照してください。
設定可能な圧縮方式
テーブルの作成時に圧縮アルゴリズムを指定し、ワークロードに応じて圧縮効率とクエリ性能のバランスを選択できます。
圧縮に影響する要因
圧縮の効果は、選択したアルゴリズムだけでなく、データ自体の特性にも左右されます。
| 要因 | 説明 |
|---|---|
| データの連続性 | タイムスタンプや連続する数値など、データの並びが規則的であるほど、圧縮アルゴリズムが繰り返しパターンを見つけやすくなり、圧縮率が高くなります。 |
| データの冗長性 | 列に同じ値が多いほど圧縮効果が高まります。特に、冗長性の高いデータには辞書エンコーディングが有効です。 |
| データ型 | 数値型(整数、浮動小数点数)は通常、文字列型より圧縮しやすくなります。値の範囲が広いほど、圧縮への影響が大きくなります。 |
| 列の長さ | 短い列は通常、長い列より圧縮しやすくなります。短いデータブロックでは、圧縮アルゴリズムが繰り返しパターンをより効率的に見つけられるためです。 |
| NULL 値の割合 | NULL 値の割合が高い場合、圧縮アルゴリズムはそれらを特別なパターンとしてエンコードし、ストレージ容量をさらに削減できます。 |
Doris での圧縮設定
テーブルの作成時に、compression パラメータを PROPERTIES で指定して圧縮アルゴリズムを設定します。
CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);
compression に指定できる値は、none、lz4、lz4f、lz4hc、zstd、snappy、zlib です。明示的に指定しない場合、Doris はデフォルトの圧縮アルゴリズムである ZSTD を使用します(FE 設定の default_compression_type で制御されます)。