リソースグループ
このトピックでは、StarRocks のリソースグループ機能について説明します。
この機能を使用すると、短いクエリ、アドホッククエリ、ETL ジョブなど、複数のワークロードを単一のクラスターで同時に実行でき、複数のクラスターを展開するための追加コストを節約できます。技術的な観点から見ると、実行エンジンはユーザーの指定に従って同時にワークロードをスケジュールし、それらの間の干渉を分離します。
リソースグループのロードマップ:
- v2.2 以降、StarRocks はクエリのリソース消費を制限し、同じクラスター内のテナント間でのリソースの分離と効率的な使用を実現します。
- StarRocks v2.3 では、大規模クエリのリソース消費をさらに制限し、過大なクエリ要求によってクラスターリソースが枯渇するのを防ぎ、システムの安定性を保証します。
- StarRocks v2.5 は、データロード(INSERT)の計算リソース消費を制限します。
- v3.3.5 以降、StarRocks は CPU リソースに対する厳しい制限を課すことを サポートします。
Internal Table | External Table | Big Query Restriction | INSERT INTO | Broker Load | Routine Load, Stream Load, Schema Change | CPU Hard Limit | |
---|---|---|---|---|---|---|---|
2.2 | √ | × | × | × | × | × | x |
2.3 | √ | √ | √ | × | × | × | x |
2.5 | √ | √ | √ | √ | × | × | x |
3.1 & 3.2 | √ | √ | √ | √ | √ | × | x |
3.3.5 and later | √ | √ | √ | √ | √ | × | √ |
用語
このセクションでは、リソースグループ機能を使用する前に理解しておくべき用語について説明します。
リソースグループ
各リソースグループは、特定の BE からの計算リソースのセットです。クラスターの各 BE を複数のリソースグループに分割できます。クエリがリソースグループに割り当てられると、StarRocks は指定されたリソースクォータに基づいて、そのリソースグループに CPU とメモリリソースを割り当てます。
BE 上のリソースグループに対して、次のパラメータを使用して CPU とメモリのリソースクォータを指定できます。
パラメー タ | 説明 | 値の範囲 | デフォルト |
---|---|---|---|
cpu_weight | BE ノード上のこのリソースグループの CPU スケジューリングの重み。 | (0, avg_be_cpu_cores ] (0 より大きい場合に有効) | 0 |
exclusive_cpu_cores | このリソースグループの CPU ハードアイソレーションパラメータ。 | (0, min_be_cpu_cores - 1 ] (0 より大きい場合に有効) | 0 |
mem_limit | 現在の BE ノード上でこのリソースグループがクエリに利用できるメモリの割合。 | (0, 1] (必須) | - |
spill_mem_limit_threshold | ディスクへのスピリングをトリガーするメモリ使用量のしきい値。 | (0, 1] | 1.0 |
concurrency_limit | このリソースグループでの同時クエリの最大数。 | 整数 (0 より大きい場合に有効) | 0 |
big_query_cpu_second_limit | 各 BE ノードでの大規模クエリタスクの最大 CPU 時間(秒単位)。 | 整数 (0 より大きい場合に有効) | 0 |
big_query_scan_rows_limit | 各 BE ノードで大規模クエリタスクがスキャンできる最大行数。 | 整数 (0 より大きい場合に有効) | 0 |
big_query_mem_limit | 各 BE ノードで大規模クエリタスクが使用できる最大メモリ。 | 整数 (0 より大きい場合に有効) | 0 |
CPU リソースパラメータ
cpu_weight
このパラメータは、単一の BE ノード上のリソースグループの CPU スケジューリングの重みを指定し、このグループからのタスクに割り当てられる CPU 時間の相対的なシェアを決定します。v3.3.5 以前では、これは cpu_core_limit
と呼ばれていました。
その値の範囲は (0, avg_be_cpu_cores
] で、avg_be_cpu_cores
はすべての BE ノードにおける CPU コアの平均数です。このパラメータは、0 より大きい値に設定された場合にのみ有効です。cpu_weight
または exclusive_cpu_cores
のいずれかが 0 より大きくなければなりませんが、両方ではありません。
注意
例えば、3 つのリソースグループ rg1、rg2、rg3 がそれぞれ cpu_weight 値 2、6、8 を持っているとします。完全に負荷がかかっている BE ノードでは、これらのグループはそれぞれ 12.5%、37.5%、50% の CPU 時間を受け取ります。ノードが完全に負荷がかかっていない場合、rg1 と rg2 が負荷を受けている間、rg3 がアイドル状態である場合、rg1 と rg2 はそれぞれ 25% と 75% の CPU 時間を受け取ります。
exclusive_cpu_cores
このパラメータは、リソースグループの CPU ハード制限を定義します。これには 2 つの意味があります。
- 専用:
exclusive_cpu_cores
CPU コアをこのリソースグループ専 用に予約し、アイドル状態でも他のグループには利用できません。 - クォータ: リソースグループをこれらの予約された CPU コアのみを使用するように制限し、他のグループから利用可能な CPU リソースを使用できないようにします。
値の範囲は (0, min_be_cpu_cores - 1
] で、min_be_cpu_cores
はすべての BE ノードにおける CPU コアの最小数です。0 より大きい場合にのみ有効です。cpu_weight
または exclusive_cpu_cores
のいずれかのみが 0 より大きく設定できます。
exclusive_cpu_cores
が 0 より大きいリソースグループは専用リソースグループと呼ばれ、それに割り当てられた CPU コアは専用コアと呼ばれます。他のグループは共有リソースグループと呼ばれ、共有コアで実行されます。- すべてのリソースグループにわたる
exclusive_cpu_cores
の合計数はmin_be_cpu_cores - 1
を超えることはできません。上限は、少なくとも 1 つの共有コアを利用可能にするために設定されています。
exclusive_cpu_cores
と cpu_weight
の関係:
cpu_weight
または exclusive_cpu_cores
のいずれかのみが一度にアクティブにできます。専用リソースグループは、cpu_weight
を介して CPU 時間のシェアを要求することなく、独自の予約された専用コアで動作します。
共有リソースグループが専用リソースグループから専用コアを借りることができるかどうかを BE 設定 enable_resource_group_cpu_borrowing
を使用して設定できます。デフォルトでは true
に設定されており、専用グループがアイドル状態の ときに共有グループが CPU リソースを借りることができます。
この設定を動的に変更するには、次のコマンドを使用します。
UPDATE information_schema.be_configs SET VALUE = "false" WHERE NAME = "enable_resource_group_cpu_borrowing";
メモリリソースパラメータ
mem_limit
現在の BE ノードでリソースグループが利用できるメモリ(クエリプール)の割合を指定します。値の範囲は (0,1] です。
spill_mem_limit_threshold
ディスクへのスピリングをトリガーするメモリ使用量のしきい値を定義します。値の範囲は (0,1] で、デフォルトは 1(非アクティブ)です。v3.1.7 で導入されました。
- 自動スピリングが有効(
spill_mode
がauto
に設定)で、リソースグループが無効な場合、クエリのメモリ使用量がquery_mem_limit
の 80% を超えると、システムは中間結果をディスクにスピルします。 - リソースグループが有効な場合、次の場合にスピリングが発生します:
- グループ内のすべてのクエリのメモリ使用量が
current BE memory limit * mem_limit * spill_mem_limit_threshold
を超える場合、または - 現在のクエリのメモリ使用量が
query_mem_limit
の 80% を超える場合。
- グループ内のすべてのクエリのメモリ使用量が
クエリ同時実行パラメータ
concurrency_limit
システムの過負荷を防ぐために、リソースグループ内の同時クエリの最大数を定義します。0 より大きい場合にのみ有効で、デフォルト値は 0 です。
大規模クエリリソースパラメータ
次のパラメータを使用して、大規模クエリに対するリソース制限を設定できます。
big_query_cpu_second_limit
各 BE ノードで大規模クエリタスクが使用できる最大 CPU 時間(秒単位)を指定し、並列タスクによって使用された実際の CPU 時間を合計します。0 より大きい場合にのみ有効で、デフォルト値は 0 です。
big_query_scan_rows_limit
各 BE ノードで大規模クエリタスクがスキャンできる行数の制限を設定します。0 より大きい場合にのみ有効で、デフォルト値は 0 です。
big_query_mem_limit
各 BE ノードで大規模クエリタスクが使用できる最大メモリをバイト単位で定義します。0 より大きい場合にのみ有効で、デフォルト値は 0 です。
注意
リソースグループで実行中のクエリが上記の大規模クエリ制限を超えた場合、そのクエリはエラーで終了します。エラーメッセージは FE ノードの fe.audit.log の
ErrorCode
列でも確認できます。
タイプ(v3.3.5 以降非推奨)
v3.3.5 以前は、StarRocks はリソースグループの type
を short_query
に設定することができました。しかし、パラメータ type
は非推奨となり、exclusive_cpu_cores
に置き換えられました。このタイプの既存のリソースグループについては、システムは v3.3.5 にアップグレード後、exclusive_cpu_cores
の値が cpu_weight
と等しい専用リソースグループに自動的に変換します。
システム定義のリソースグループ
各 StarRocks インスタンスには、default_wg
と default_mv_wg
の 2 つのシステム定義のリソースグループがあります。システム定義のリソースグループの構成は ALTER RESOURCE GROUP コマンドを使用して変更できますが、それらに対してクラシファイアを定義したり、システム定義のリソースグループを削除したりすることはできません。
default_wg
default_wg
は、リソースグループの管理下にあるが、どのクラシファイアにも一致しない通常のクエリに割り当てられます。default_wg
のデフォルトのリソース制限は次のとおりです。
cpu_weight
: BE の CPU コア数。mem_limit
: 100%。concurrency_limit
: 0。big_query_cpu_second_limit
: 0。big_query_scan_rows_limit
: 0。big_query_mem_limit
: 0。spill_mem_limit_threshold
: 1。
default_mv_wg
default_mv_wg
は、マテリアライズドビューの作成時にプロパティ resource_group
で対応するマテリアライズドビューにリソースグループが割り当てられていない場合、非同期マテリアライズドビューのリフレッシュタスクに割り当てられます。default_mv_wg
のデフォルトのリソース制限は次のとおりです。
cpu_weight
: 1。mem_limit
: 80%。concurrency_limit
: 0。spill_mem_limit_threshold
: 80%。
クラシファイア(分類器)
各クラシファイアは、クエリのプロパティに一致する 1 つ以上の条件を保持します。StarRocks は、各クエリに最も適したクラシファイアを条件に基づいて特定し、クエリの実行に必要なリソースを割り当てます。
クラシファイアは次の条件をサポートします。
user
: ユーザーの名前。role
: ユーザーの役割。query_type
: クエリのタイプ。SELECT
とINSERT
(v2.5 以降)がサポートされています。INSERT INTO または BROKER LOAD タスクがquery_type
をinsert
とするリソースグループにヒットした場合、BE ノードはタスクのために指定された CPU リソースを予約します。source_ip
: クエリが開始された CIDR ブロック。db
: クエリがアクセスするデータベース。カンマ,
で区切られた文字列で指定できま す。plan_cpu_cost_range
: クエリの推定 CPU コスト範囲。形式は(DOUBLE, DOUBLE]
です。デフォルト値は NULL で、そのような制限がないことを示します。PlanCpuCost
列は、クエリの CPU コストに対するシステムの推定値を表します。このパラメータは v3.1.4 以降でサポートされています。plan_mem_cost_range
: クエリのシステム推定メモリコスト範囲。形式は(DOUBLE, DOUBLE]
です。デフォルト値は NULL で、そのような制限がないことを示します。PlanMemCost
列は、クエリのメモリコストに対するシステムの推定値を表します。このパラメータは v3.1.4 以降でサポートされています。
クラシファイアは、クラシファイアの条件のいずれかまたはすべてがクエリの情報と一致する場合にのみクエリに一致します。複数のクラシファイアがクエリに一致する場合、StarRocks はクエリと各クラシファイアの一致度を計算し、一致度が最も高いクラシファイアを特定します。
注意
クエリが属するリソースグループは、FE ノードの fe.audit.log の
ResourceGroup
列で確認するか、EXPLAIN VERBOSE <query>
を実行して確認できます。詳しくは クエリのリソースグループを表示する を参照してください。
StarRocks は、次のルールを使用してクエリとクラシファイアの一致度を計算します。
- クラシファイアがクエリと同じ
user
値を持っている場合、クラシファイアの一致度は 1 増加します。 - クラシファイアがクエリと同じ
role
値を持っている場合、クラシファイアの一致度は 1 増加します。 - クラシファイアがクエリと同じ
query_type
値を持っている場合、クラシファイアの一致度は 1 増加し、次の計算から得られる数値も加算されます: 1/クラシファイア内のquery_type
フィールドの数。 - クラシファイアがクエリと同じ
source_ip
値を持っている場合、クラシファイアの一致度は 1 増加し、次の計算から得られる数値も加算されます: (32 -cidr_prefix
)/64。 - クラシファイアがクエリと同じ
db
値を持っている場合、クラシファイアの一致度は 10 増加します。 - クエリの CPU コストが
plan_cpu_cost_range
内にある場合、クラシファイアの一致度は 1 増加します。 - クエリのメモリコストが
plan_mem_cost_range
内にある場合、クラシファイアの一致度は 1 増加します。
複数のクラシファイアがクエリに一致する場合、条件の数が多いクラシファイアの方が一致度が高くなります。
-- クラシファイア B はクラシファイア A よりも多くの条件を持っています。したがって、クラシファイア B はクラシファイア A よりも一致度が高くなります。
クラシファイア A (user='Alice')
クラシファイア B (user='Alice', source_ip = '192.168.1.0/24')
複数の一致するクラシファイアが同じ条件数を持つ場合、条件がより正確に記述されているクラシファイアの方が一致度が高くなります。
-- クラシファイア B に指定された CIDR ブロックは、クラシファイア A よりも範囲が小さいです。したがって、クラシファイア B はクラシファイア A よりも一致度が高くなります。
クラシファイア A (user='Alice', source_ip = '192.168.1.0/16')
クラシファイア B (user='Alice', source_ip = '192.168.1.0/24')
-- クラシファイア C はクラシファイア D よりも指定されたクエリタイプが少ないです。したがって、クラシファイア C はクラシファイア D よりも一致度が高くなります。
クラシファイア C (user='Alice', query_type in ('select'))
クラシファイア D (user='Alice', query_type in ('insert','select'))
複数のクラシファイアが同じ一致度を持つ場合、クラシファイアのいずれかがランダムに選択されます。
-- クエリが同時に db1 と db2 をクエリし、クラシファイア E と F がヒットしたクラシファイアの中で最も一致度が高い場合、E と F のいずれかがランダムに選択されます。
クラシファイア E (db='db1')
クラシファイア F (db='db2')
計算リソースの分離
リソースグループとクラシファイアを設定することで、クエリ間の計算リソースを分離できます。
リソースグループを有効にする
リソースグループを使用するには、StarRocks クラスターの Pipeline Engine を有効にする必要があります。
-- 現在のセッションで Pipeline Engine を有効にします。
SET enable_pipeline_engine = true;
-- グローバルに Pipeline Engine を有効にします。
SET GLOBAL enable_pipeline_engine = true;
注意
v3.1.0 以降、リソースグループはデフォルトで有効になっており、セッション変数
enable_resource_group
は非推奨です。
リソースグループとクラシファイアを作成する
次のステートメントを実行して、リソースグループを作成し、クラシファイアと関連付け、リソースグループに計算リソースを割り当てます。
CREATE RESOURCE GROUP <group_name>
TO (
user='string',
role='string',
query_type in ('select'),
source_ip='cidr'
) -- クラシファイアを作成します。複数のクラシファイアを作成する場合、クラシファイアをカンマ(`,`)で区切ります。
WITH (
"{ cpu_weight | exclusive_cpu_cores }" = "INT",
"mem_limit" = "m%",
"concurrency_limit" = "INT",
"type" = "str" -- リソースグループのタイプ。値を normal に設定します。
);
例:
CREATE RESOURCE GROUP rg1
TO
(user='rg1_user1', role='rg1_role1', query_type in ('select'), source_ip='192.168.x.x/24'),
(user='rg1_user2', query_type in ('select'), source_ip='192.168.x.x/24'),
(user='rg1_user3', source_ip='192.168.x.x/24'),
(user='rg1_user4'),
(db='db1')
WITH (
'exclusive_cpu_cores' = '10',
'mem_limit' = '20%',
'big_query_cpu_second_limit' = '100',
'big_query_scan_rows_limit' = '100000',
'big_query_mem_limit' = '1073741824'
);
リソースグループを指定する(オプション)
現在のセッションに対して、default_wg
や default_mv_wg
を含むリソースグループを直接指定できます。
SET resource_group = 'group_name';