コンパクション
Doris は LSM-Tree に似た構造でデータを書き込み、バックグラウンドでコンパクションを実行して小さなファイルを大きな整列済みファイルに継続的にマージします。コンパクションは削除や更新などの操作も処理します。
コンパクションの方式を適切に調整すると、ロードとクエリの効率を大幅に改善できます。Doris では、調整に使用できる次のコンパクション方式を提供しています。
垂直コンパクション
垂直コンパクションは Doris 1.2.2 で実装された新しいコンパクションアルゴリズムで、大規模なデータや列数の多いテーブルにおけるコンパクションの実行効率とリソース消費を最適化するために使用します。コンパクションのメモリ消費を効果的に抑え、実行速度を向上させます。テスト結果では、垂直コンパクションのメモリ消費量は従来のコンパクションアルゴリズムの 1/10 に減少し、コンパクション速度は 15% 向上しました。
垂直コンパクションでは、行単位のマージを列グループ単位のマージに変更します。各マージの単位が列グループになるため、個々のコンパクションで処理するデータ量が減り、コンパクション中のメモリ使用量を抑えられます。
BE の設定:
enable_vertical_compaction = true: 垂直コンパクションを有効にします。vertical_compaction_num_columns_per_group = 5: 各列グループに含める列数です。テストでは、デフォルトの 5 列にすると効率とメモリ使用量のバランスが良好でした。vertical_compaction_max_segment_size: 垂直コンパクション後のディスクファイルのサイズを設定します。デフォルト値は 268435456 バイトです。
セグメントコンパクション
セグメントコンパクションは、主に大量のデータのロードに対応するための方式です。通常のコンパクションや垂直コンパクションとは異なり、ロード処理中にジョブ内のセグメントをマージします。この仕組みにより、生成されるセグメント数を効果的に減らし、-238(OLAP_ERR_TOO_MANY_SEGMENTS)エラーを回避できます。
セグメントコンパクションには、次の特徴があります。
- ロード時に生成されるセグメント数を減らします。
- コンパクション処理はロード処理と並行して実行されるため、ロード時間は増えません。
- ロード中のメモリ消費量と計算リソースの使用量は増えますが、長いロード処理全体に分散されるため、増加幅は比較的小さくなります。
- セグメントコンパクション後のデータは、後続のクエリや通常のコンパクションで、リソースと性能の面で有利になります。
BE の設定:
enable_segcompaction=true: セグメントコンパクションを有効にします。segcompaction_batch_size: マージの間隔を設定します。デフォルト値の 10 は、セグメントファイルが 10 個生成されるたびにセグメントコンパクションを実行することを意味します。10~30 の範囲を推奨します。値を大きくすると、セグメントコンパクションのメモリ使用量が増えます。
セグメントコンパクションを推奨する状況:
- 大量のデータをロードする際に、OLAP_ ERR_ TOO_ MANY_ SEGMENTS(エラーコード - 238)エラーで失敗する場合。ロード中のセグメント数を減らすため、セグメントコンパクションを有効にすることを推奨します。
- ロード中に小さなファイルが多数生成される場合。ロードするデータ量が妥当でも、カーディナリティが低い場合や、メモリ制約によって memtable が早期にフラッシュされる場合には、小さなセグメントファイルが大量に生成され、ロードジョブが失敗する可能性があります。この場合は、セグメントコンパクションを有効にすることを推奨します。
- ロード直後にクエリを実行する場合。ロードが完了しても通常のコンパクションがまだ完了していないと、多数のセグメントファイルが後続のクエリの効率に影響します。ロード直後にクエリを実行する必要がある場合は、セグメントコンパクションを有効にすることを推奨します。
- ロード後の通常のコンパクションにかかる負荷が高い場合。セグメントコンパクションにより、通常のコンパクションの負荷の一部をロード処理全体に分散できます。この場合は、セグメントコンパクションを有効にすることを推奨します。
セグメントコンパクションを推奨しない状況:
- ロード処理ですでにメモリリソースを使い切っている場合。メモリ負荷がさらに増してロードジョブが失敗するのを避けるため、セグメントコンパクションは推奨しません。
実装とテスト結果の詳細については、こちらの リンク を参照してください。
コンパクション方式
コンパクション方式は、小さなファイルをいつ、どのように大きなファイルにマージするかを決めます。Doris では現在、テーブルプロパティの compaction_policy パラメータで指定する二種類のコンパクション方式を提供しています。
サイズベースのコンパクション方式
サイズベースのコンパクション方式はデフォルトで、ほとんどの状況に適しています。
"compaction_policy" = "size_based"
時系列コンパクション方式
時系列コンパクション方式は、ログや時系列データなどに適しています。時系列データの時間的な局所性を利用し、近い時刻に書き込まれた小さなファイルを大きなファイルにマージします。各ファイルがコンパクションに参加するのは一度だけなので、繰り返しのコンパクションによる書き込み増幅を抑えられます。
"compaction_policy" = "time_series"
次のいずれかの条件を満たすと、時系列コンパクションが実行されます。
- マージされていないファイルのサイズが
time_series_compaction_goal_size_mbytes(デフォルトは 1 GB)を超えた場合。 - マージされていないファイルの数が
time_series_compaction_file_count_threshold(デフォルトは 2000)を超えた場合。 - 前回のコンパクションからの経過時間が
time_series_compaction_time_threshold_seconds(デフォルトは 1 時間)を超えた場合。
これらのパラメータはテーブルの PROPERTIES で設定し、テーブルの作成時に指定するか、後で次のコマンドを使用して変更できます。
ALTER TABLE table_name SET("name" = "value");
コンパクションの同時実行数の制御
コンパクションはバックグラウンドで実行され、CPU と IO のリソースを消費します。同時に実行するコンパクションスレッドの数を調整すると、リソース消費を制御できます。
同時に実行するコンパクションスレッドの数は BE の設定ファイルで設定します。対象となるパラメータは次のとおりです。
max_base_compaction_threads: ベースコンパクションのスレッド数。デフォルトは 4 です。max_cumu_compaction_threads: 累積コンパクションのスレッド数。デフォルトは -1 で、ディスクごとに 1 スレッドを意味します。