Hologres は V2.1.17 以降のバージョンでサーバーレスコンピューティングをサポートしています。このトピックでは、Hologres でサーバーレスコンピューティングを使用してタスクを実行する方法について説明します。
サポートされている機能
サーバーレスコンピューティングは、次のタスクタイプをサポートしています:
V2.1.17 以降: データ操作言語 (DML) タスク。これには
INSERT(INSERT OVERWRITEを除く)、INSERT ON CONFLICT(UPSERT)、DELETE、およびUPDATEが含まれます。V2.2.14 以降: データクエリ言語 (DQL) タスク。
V3.0.1 以降: DML の
COPYタスク。V3.0.9 以降:
CREATE TABLE AS(CTAS) タスク。V2.2.42/V3.0.19 以降:
RESHARDINGタスク。V3.0.26 以降:
INSERT OVERWRITEタスク (hg_insert_overwriteストアドプロシージャ経由)、およびストアドプロシージャ内の DML と DQL。V3.1.0 以降: DML のネイティブ
INSERT OVERWRITE構文、およびREBUILDタスク。V3.1.3 以降: 暗号化されたテーブルでの読み取りおよび書き込み操作。暗号化された内部テーブルおよび暗号化された MaxCompute 外部/外部テーブルを含みます。この機能を使用するには、
hg_serverless_computing_enable_encrypted_tableGUC パラメーターを有効にします。詳細については、「データ暗号化」をご参照ください。V3.1.11 以降: Compaction タスク。詳細については、「サーバーレスコンピューティングを使用して Compaction タスクを実行する」をご参照ください。
4.0 以降: Data Lake Formation (DLF) 外部テーブルに対する読み取りおよび書き込み操作。詳細については、「DLF を使用して OSS からデータを読み取り、OSS にデータを書き込む」をご参照ください。
サーバーレスコンピューティングは、次の関数拡張をサポートしています:
ClickHouse
フロー分析
PostGIS
RoaringBitmap
BSI
Proxima
サーバーレスコンピューティングは、次のシナリオではサポートされていません:
読み取り専用セカンダリインスタンスでのクエリ。プライマリインスタンスと仮想ウェアハウスインスタンスは影響を受けません。
set hg_experimental_enable_transaction = onのように、複数行 DML トランザクションが有効になっているクエリ。固定計画を使用する SQL 文。
クロスデータベースのクエリまたは書き込み。
サーバーレスコンピューティングリソースを使用して読み取りおよび書き込みタスクを実行する
Hologres では、サーバーレスコンピューティングリソースを柔軟に使用できます。個々の SQL 文をオンデマンドでサーバーレスリソース上で実行したり、ルールを設定して SQL 文をバッチでサーバーレスリソース上で実行したりできます。
実行前に SQL 文をサーバーレスリソースにディスパッチするには、優先度の高い順に次のメソッドを使用します:
SQL レベル (セッションレベル):
hg_computing_resourceパラメーターを'serverless'に設定します。現在の接続での読み取りおよび書き込みリクエストは、サーバーレスリソースを使用します。ユーザーレベル: 特定のユーザーに対して
hg_computing_resourceパラメーターを'serverless'に設定します。このユーザーからのすべてのクエリは、サーバーレスリソースを使用します。クエリキューレベル: クエリキュー内のすべてのタスクがサーバーレスリソースを使用するように構成します。
アダプティブサーバーレスコンピューティング: 有効にすると、システムは大規模なタスクを自動的に識別し、サーバーレスリソースを使用して実行します。
これらの条件のいずれも満たされない場合、クエリは現在のインスタンスの専用リソースを使用します。
また、すでに進行中の大規模なクエリをサーバーレスリソースで自動的に再実行するように構成することもできます。これにより、本番サービスへの負荷が軽減され、メモリ不足 (OOM) エラーの頻度が低下し、システムの安定性が向上します。
サーバーレスリソースで実行されている SQL 文は、それらのリソースを排他的に使用します。
SQL レベルでの構成
このメソッドは、多くの場合、次のシナリオで使用されます:
既存データのリフレッシュやテーブルスキーマと属性の変更 (
REBUILD) など、1 回限りのインポートまたはクエリタスク。月次、日次、または時間単位のデータインポートおよびエクスポートなどの定期的なバッチインポートタスク。この構成をスケジュールされたタスクに追加できます。
サーバーレスリソースの柔軟な使用を必要とするその他のシナリオ。
次のコードを使用して、サーバーレスコンピューティングリソースで SQL コマンドを実行します。このパラメーターはセッションレベルで設定することをお勧めします。
-- サーバーレスコンピューティングリソースを使用して SQL 文を実行します。パラメーターのデフォルト値は local で、現在のインスタンスの専用リソースが SQL 文の実行に使用されることを示します。
SET hg_computing_resource = 'serverless';
-- DML 文を送信した後、構成をリセットして、不要な SQL 文がサーバーレスリソースを使用しないようにします。
RESET hg_computing_resource;このパラメーターをデータベースレベルで変更しないでください。
RESET hg_computing_resourceを実行して構成をリセットし、サーバーレスリソースの不要な使用を防ぎます。
例:
-- データを準備します --
-- ソーステーブルを作成します。
CREATE TABLE source_tbl ( id int );
-- 宛先テーブルを作成します。
CREATE TABLE sink_tbl ( id int );
-- ソーステーブルにサンプルデータを書き込みます。
INSERT INTO source_tbl
SELECT * FROM generate_series(1, 99999999);
-- サーバーレスリソースを使用して SQL 文を実行します --
-- セッションレベルでサーバーレスコンピューティングを有効にします。
SET hg_computing_resource = 'serverless';
-- SQL 文を実行します。
INSERT INTO sink_tbl SELECT * FROM source_tbl;
-- 構成をリセットします。
RESET hg_computing_resource;ユーザーレベルでの構成
このメソッドは、多くの場合、次のシナリオで使用されます:
スーパーユーザーなどの高権限ユーザーの日常的な操作。
優先度の高いデータダッシュボード。ダッシュボードのデータソースに関連付けられているユーザーアカウントを構成できます。
次のコードを使用して、特定の USER または ROLE からのすべての SQL 文がデフォルトでサーバーレスコンピューティングリソースを使用するように構成します。
この構成はデータベースレベルの設定よりも優先度が高いですが、セッションレベルの設定によって上書きされます。詳細については、「GUC パラメーター」をご参照ください。
-- 特定のデータベースに対して、ユーザーがデフォルトでサーバーレスコンピューティングリソースを使用するように構成します
ALTER USER "<role_name>" IN DATABASE <db_name> SET hg_computing_resource = 'serverless';
-- 構成をリセットします
ALTER USER "<role_name>" IN DATABASE <db_name> RESET hg_computing_resource;クエリキューレベルでの構成
Hologres では、特定のクエリキュー内のすべての SQL 文がサーバーレスコンピューティングリソースを使用するように構成できます。クエリキューの構成方法の詳細については、「クエリキュー」をご参照ください。この構成では、クエリキューの分類子機能を使用して、特定の種類の SQL 文が常にサーバーレスリソースを使用するようにします。例は次のとおりです:
クエリタイプ別:
INSERT、SELECT、UPDATE、およびDELETE。クエリエンジン別: HQE、PQE、SQE、HiveQE。たとえば、MaxCompute 外部/外部テーブルのすべてのプッシュダウンクエリ (SQE タスク) は、サーバーレスリソースを使用するように構成できます。
SQL 指紋別: 特定のクエリパターンが大量のリソースを消費し、安定性に影響を与える可能性がある場合は、対応する SQL 指紋を常にサーバーレスリソースを使用するように構成します。
ストレージモード別:
hotおよびcold。たとえば、コールドストレージ上のすべてのクエリは、サーバーレスリソースを使用するように構成できます。
次のコードを使用して構成を適用します:
汎用インスタンスの場合
-- ターゲットキュー内のすべてのクエリがサーバーレスリソースで実行されるように設定します CALL hg_set_query_queue_property('<query_queue_name>', 'computing_resource', 'serverless'); -- (オプション) ターゲットキュー内のクエリがサーバーレスリソースを使用する場合の優先度を設定します。値は 1〜5 で、デフォルトは 3 です。 CALL hg_set_query_queue_property('<query_queue_name>', 'query_priority_when_using_serverless_computing', '<priority>');仮想ウェアハウスインスタンスの場合
-- ターゲットキュー内のすべてのクエリがサーバーレスリソースで実行されるように設定します CALL hg_set_query_queue_property('<warehouse_name>', '<query_queue_name>', 'computing_resource', 'serverless'); -- (オプション) ターゲットキュー内のクエリがサーバーレスリソースを使用する場合の優先度を設定します。値は 1〜5 で、デフォルトは 3 です。 CALL hg_set_query_queue_property('<warehouse_name>', '<query_queue_name>', 'query_priority_when_using_serverless_computing', '<priority>');
アダプティブサーバーレスコンピューティング
Hologres は、リソースを大量に消費するタスクを自動的に識別し、サーバーレスリソースで実行できます。詳細については、「アダプティブサーバーレスコンピューティング」をご参照ください。
大規模タスクの自動再実行
システムの安定性を向上させ、SQL 文が過剰なインスタンスリソースを消費するのを防ぐために、大規模なクエリをサーバーレスリソースで自動的に再実行するように構成します。特定の実行時間を超えたり、OOM エラーを引き起こしたりするなどの条件によって、大規模なクエリを定義できます。詳細については、「大規模クエリ制御」をご参照ください。
サーバーレスコンピューティングタスクの優先度の設定
Hologres では、サーバーレスコンピューティングキューに入る SQL 文の優先度を設定できます。単一の SQL 文が使用できるサーバーレスリソースの最大量を定義し、優先度ベースのキューイングメカニズムを実装することで、サーバーレスコンピューティングキュー内の SQL 文が安定して順序どおりに実行されるようにすることができます。
次の例を考えてみましょう:
インスタンスには 32 vCPU の専用リソースがあり、利用可能なサーバーレスコンピューティングリソースの最大値は 96 vCPU です。SQL A は現在実行中で、64 vCPU のサーバーレスリソースを使用しています。一方、サーバーレスコンピューティングキューには他の 2 つの文があります: SQL B (48 vCPU が必要、優先度 5) と SQL C (32 vCPU が必要、優先度 3)。この場合、Hologres は SQL A が完了するのを待ってから 48 vCPU を割り当てて SQL B を実行し、残りの 32 vCPU を最初に使用して SQL C を実行するわけではありません。
次のコードを使用して、サーバーレスリソースのキューに入っている SQL 文の実行優先度を設定します。
優先度は 1 から 5 の範囲で、デフォルト値は 3 です。値が大きいほど優先度が高くなり、要求された量に関係なく、タスクが最初にリソースを受け取ることを意味します。
-- セッションレベルで構成 SET hg_experimental_serverless_computing_query_priority = 5; -- 構成をリセットします。 RESET hg_experimental_serverless_computing_query_priority; -- ユーザーレベルで構成 ALTER USER "<role_name>" IN DATABASE <db_name> SET hg_experimental_serverless_computing_query_priority = 5; -- 構成をリセットします。 ALTER USER "<role_name>" IN DATABASE <db_name> RESET hg_experimental_serverless_computing_query_priority;例
-- サーバーレスリソースを使用して SQL 文を実行します。 SET hg_computing_resource = 'serverless'; -- この SQL 文の優先度を 5 に設定します。 SET hg_experimental_serverless_computing_query_priority to 5; -- SQL 文を実行します INSERT INTO sink_tbl SELECT * FROM source_tbl; -- 構成をリセットします RESET hg_computing_resource; RESET hg_experimental_serverless_computing_query_priority;
サーバーレスコンピューティング構成の検証
次のコードを使用して、前の SQL 文の実行計画を表示します。
-- サーバーレスリソースを使用して SQL 文を実行します。
SET hg_computing_resource = 'serverless';
-- 実行文を説明します。
EXPLAIN INSERT INTO sink_tbl SELECT * FROM source_tbl;
-- 構成をリセットします。
RESET hg_computing_resource;コードは次の結果を返します。出力に Computing Resource: Serverless が含まれている場合、SQL 文がサーバーレスコンピューティングリソースを使用していることを示します。
QUERY PLAN
------------------------------------------------------------------------------------------
Gather (cost=0.00..5.18 rows=100 width=4)
-> Insert (cost=0.00..5.18 rows=100 width=4)
-> Redistribution (cost=0.00..5.10 rows=100 width=4)
-> Local Gather (cost=0.00..5.10 rows=100 width=4)
-> Decode (cost=0.00..5.10 rows=100 width=4)
-> Seq Scan on source_tbl (cost=0.00..5.00 rows=100 width=4)
Computing Resource: Serverless
Optimizer: HQO version 2.1.0
(8 rows)サーバーレスリソースで実行中のタスクや履歴タスクを表示することもできます。詳細については、「サーバーレスコンピューティングの監視と O&M」をご参照ください。