このトピックでは、ApsaraDB for ClickHouseのリソースキューの使用方法について説明します。
背景情報
オープンソースのClickHouseはリソースキューをサポートしていません。 V20.8以降のApsaraDB For ClickHouseクラスターのクエリの複雑さの制限については、「クエリの複雑さの制限」をご参照ください。
リソースキューは、ApsaraDB for ClickHouseの拡張機能であり、V20.3のApsaraDB for ClickHouseクラスターでのみサポートされます。 オープンソースのClickHouseは、ユーザーレベルのメモリ分離メカニズムを提供します。 ApsaraDB for ClickHouseクラスターを購入すると、デフォルトではリソースキュー機能は有効になりません。
リソースキューの構文
次のサンプル構文は、リソースキューを管理する方法を示しています。
-- リソースキューを作成します。
CREATE RESOURCE QUEUE [存在しない場合 | OR REPLACE] name [ON CLUSTER cluster]
* {[SET] MEMORY = {number}
* [, CONCURRENCY = {number}]
* [, PRIORITY = { LOWEST | LOW | NORMAL | HIGH | HIGHEST }]
* [, ISOLATE = {number}]
* }
* [TO {role [,...] | ALL | ALL | ALL EXCEPT role [,...]}]
-- 指定されたリソースキューを変更します。
ALTER RESOURCE QUEUE [存在しない場合 | OR REPLACE] name [ON CLUSTER cluster]
* {[SET] MEMORY = {number}
* [, CONCURRENCY = {number}]
* [, PRIORITY = { LOWEST | LOW | NORMAL | HIGH | HIGHEST }]
* [, ISOLATE = {number}]
* }
* [TO {role [,...] | ALL | ALL | ALL EXCEPT role [,...]}]
-- 指定されたリソースキューを照会します。
SHOW CREATEリソースキュー名
-- 使用しているリソースキューを照会します。
SHOW CREATEリソースキューcurrent
-- 指定したリソースキューを削除します。
DROPリソースキューが存在する場合は名前 定義パラメータ:
- MEMORY: 作成するリソースキューに割り当てるメモリプールのサイズ。 ノードのすべてのメモリが既存のリソースキューに割り当てられている場合、リソースキューの作成に失敗します。
- CONCURRENCY: 作成されるリソースキューがサポートする同時クエリの最大数。 デフォルト値: 20 リソースキュー内の同時クエリの数がこの制限を超えると、追加のクエリはブロックされます。 システムによって開始されるサブクエリは、同時クエリとしてカウントされます。 これらのサブクエリはブロックされません。 リソースキューのCONCURRENCYパラメーターが20に設定され、リソースキュー内の同時システム開始サブクエリの数が25の場合、すべてのユーザー開始クエリがブロックされます。 同時システム開始サブクエリの数が20未満になった後、ユーザー開始クエリが処理されます。
- PRIORITY: 作成するリソースキューの優先度。 このパラメータは、CPUスケジューリングとメモリプリエンプションの優先度を指定します。
- ISOLATE: 作成するリソースキューのメモリ分離レベル。
- デフォルト値は0です。これは、作成するリソースキューにメモリ分離が実装されていないことを指定します。 リソースキューのメモリ使用量が少ない場合、優先度の高いリソースキューは、必要なときにリソースキューの利用可能なメモリを一時的に先取りすることができます。
- このパラメーターを1に設定すると、作成するリソースキューのソフト分離が実装されます。 この場合、より高い優先度を有するリソースキューは、作成されるリソースキューの利用可能なメモリを先取りすることができない。
- このパラメーターを2に設定すると、作成するリソースキューの絶対分離が実装されます。 この場合、より高い優先度を有するリソースキューは、作成されるリソースキューの利用可能なメモリを先取りすることができない。 また、作成されるリソースキューは、優先度の低いリソースキューの使用可能なメモリを先取りすることはできません。
- role: 作成するリソースキューがバインドされているユーザー。 このパラメーターは、
To role [,...]形式で指定します。 これらのユーザーから送信されたクエリは、作成したリソースキューにルーティングされます。 ユーザーが複数のリソースキューにバインドされている場合、システムはこのユーザーから送信されたクエリを最も優先度の高いリソースキューにルーティングします。
設定パラメータ:
- target_resource_queue: ユーザーから送信されたクエリがルーティングされるリソースキュー。 ユーザーのプロファイルファイルでクエリの強制ルーティングを設定することもできます。
- resource_queue_max_wait_ms: 同時実行制限に基づいてリソースキューでブロックされるクエリのタイムアウト期間。 デフォルト値は 10 秒です。
次のサンプルコードでは、リソースキューの管理方法の例を示します。
クラスタークラスターセットでtest_queueが存在しない場合は、リソースキューを作成します
メモリ=1073741824、懸念=20、アイソレート=0、優先度=正常
にデフォルト;
クラスタークラスターSETでanonymous_queueが存在しない場合にリソースキューを作成する
MEMORY = 1073741824、CONCURRENCY = 20、ISOLATE = 1、PRIORITY = LOW;
SHOW CREATEリソースキューtest_queue;
現在のリソースキューを作成します。SELECT count (distinct intDiv(number、10)) FROM numbers(100000) 設定target_resource_queue='anonymous_queue';
存在する場合はDROPリソースキューtest_queue;
DROPリソースキューが存在する場合anonymous_queue; リソースキューに関する情報の照会
すべてのリソースキューを照会するには、次のステートメントを実行します。
show resource queues;次の表に、クエリ結果のパラメーターを示します。
| パラメーター | データ型 | 説明 |
| name | String | リソースキューの名前。 |
| 並行性 | UInt32 | リソースキューがサポートする同時クエリの最大数。 |
| メモリ | UInt64 | リソースキューに割り当てられているメモリプールのサイズ。 単位はバイトです。 |
| 分離する | UInt8 | リソースキューのメモリ分離レベル。 |
| priority | ENUM8 | リソースキューの優先度。 |
| 役割 | Array<String> | リソースキューがバインドされているユーザー。 |
指定されたリソースキュー内のクエリに関する使用状況情報を照会するには、次のステートメントを実行します。
show resource queue stat [CURRENT | ALL];次の表に、クエリ結果のパラメーターを示します。
| パラメーター | データ型 | 説明 |
| name | String | リソースキューの名前。 |
| running_query | UInt32 | リソースキューで実行されているクエリの数。 |
| waiting_query | UInt32 | リソースキューで実行を待機しているクエリの数。 |
| grabbing_query | UInt32 | リソースキューの使用可能なメモリを一時的にプリエンプトしているクエリの数。 これらのクエリはリソースキューに属しません。 |
| allocated_memory | UInt64 | リソースキューに属するクエリによって使用されるメモリのサイズ。 単位はバイトです。 |
| grabbed_memory | UInt64 | リソースキューに属していないクエリによって一時的にプリエンプトされるメモリのサイズ。 単位はバイトです。 |
| free_memory | UInt64 | リソースキューの使用可能なメモリのサイズ。 単位はバイトです。 |
リソースキューでクエリを実行するときに発生する可能性のあるエラー
同時クエリの数が同時実行制限を超えたため、クエリがタイムアウトしました
- エラーコード: 13005
- 解決策: クライアントでの同時クエリの数を減らします。
悪いクエリで使用されるメモリのサイズがメモリプールのサイズを超えています
- エラーコード: 241
- 解決策: クエリプランを最適化するか、リソースキューに割り当てられるメモリプールのサイズを大きくします。
クエリが強制的にルーティングされる指定されたリソースキューが存在しません
- エラーコード: 13006
- 解決策: 指定されたリソースキューが作成されているかどうかを確認します。
優先度の低いリソースキューのメモリを一時的にプリエンプトしたクエリは終了します
- エラーコード: 394
- 解決策: 使用するリソースキュー内の同時クエリの数を減らし、リソースキューの優先順位を変更します。