Hologres は V2.1.17 以降、サーバーレスコンピューティングをサポートしています。このトピックでは、この機能を使用してタスクを実行する方法について説明します。
サポートされる機能
サーバーレスコンピューティングは、以下のタイプのタスクをサポートしています。
-
V2.1.17 以降:INSERT (INSERT OVERWRITE を除く)、INSERT ON CONFLICT (UPSERT)、DELETE、UPDATE を含む、主要なデータ操作言語 (DML) タスク。
-
V2.2.14 以降:データクエリ言語 (DQL) タスク。
-
V3.0.1 以降:DML の COPY タスク。
-
V3.0.9 以降:DML の CREATE TABLE AS (CTAS) タスク。
-
V2.2.42/V3.0.19 以降:RESHARDING タスク。
-
Hologres V3.0.26 以降のバージョンでは、`hg_insert_overwrite` ストアドプロシージャを介した DML の INSERT OVERWRITE タスク、およびストアドプロシージャ内の DML と DQL をサポートしています。
-
V3.1.0 以降:DML のネイティブ INSERT OVERWRITE 構文、および REBUILD タスク。
-
V3.1.3 以降:暗号化された Hologres 内部テーブルや暗号化された MaxCompute 外部テーブルなど、暗号化されたテーブルへの読み取りと書き込み。暗号化された内部テーブルへの読み取りまたは書き込みを行うには、GUC パラメーター
hg_serverless_computing_enable_encrypted_tableを有効にする必要があります。詳細については、「データ暗号化」をご参照ください。 -
V3.1.11 以降:コンパクションタスク。詳細については、「サーバーレスコンピューティングを使用したコンパクションタスクの実行」をご参照ください。
-
V4.0 以降:Data Lake Formation (DLF) 外部テーブルからの読み取りと書き込み。ファイル形式やその他の考慮事項については、「DLF に基づく OSS データレイクへのアクセスの高速化」をご参照ください。
-
V4.1 以降:データマスキング。詳細については、「データマスキング」をご参照ください。
サーバーレスコンピューティングは、以下の関数拡張をサポートしています。
-
ClickHouse
-
フロー分析
-
PostGIS
-
RoaringBitmap
-
BSI
-
Proxima
サーバーレスコンピューティングは、以下のシナリオではサポートされていません。
-
読み取り専用セカンダリインスタンスでのクエリ。サーバーレスコンピューティングは、プライマリインスタンスおよび仮想ウェアハウスインスタンスでは期待どおりに動作します。
-
set hg_experimental_enable_transaction = onの実行など、複数行 DML トランザクションが有効になっているクエリ。 -
固定プランを使用する SQL ステートメント。
-
データベース間のクエリと書き込み。
サーバーレスリソースへの SQL のルーティング
Hologres では、サーバーレスリソースを柔軟に利用できます。個々の SQL ステートメントをオンデマンドでルーティングしたり、ルールを設定して SQL バッチを実行したりできます。
Hologres は、以下の優先順位でルーティングルールを評価します。最初に一致したルールが適用されます。
-
セッションレベル:パラメーター
hg_computing_resourceを'serverless'に設定します。現在の接続における読み取り/書き込みリクエストは、サーバーレスリソースを使用します。 -
ユーザーレベル:特定のユーザーに対してパラメーター
hg_computing_resourceを'serverless'に設定し、そのユーザーのタスクがサーバーレスリソースで実行されるようにします。 -
クエリキューレベル:クエリキュー内のすべてのタスクがサーバーレスリソースで実行されるように構成します。
-
適応型サーバーレスコンピューティング:この機能を有効にすると、システムが大規模タスクを自動的に識別し、サーバーレスリソースで実行します。
-
上記のいずれの条件にも一致しない場合、タスクは現在のインスタンスのリソースで実行されます。
また、大規模クエリがサーバーレスリソースで自動的にリトライされるように構成することもできます。これにより、本番サービスの負荷が軽減され、メモリ不足 (OOM) エラーの頻度が最小限に抑えられ、システムの安定性が向上します。
SQL ステートメントがサーバーレスリソースで実行される場合、計算リソースはそのステートメント専用に割り当てられ、他の SQL ステートメントを同時に実行することはありません。
重要:
-
サーバーレスコンピューティングを使用して読み取り/書き込みリクエストを実行すると、リクエストはご利用のインスタンスの計算リソースからサーバーレスリソースプールにルーティングされます。このプロセスにはメタデータ処理が含まれ、ご利用のインスタンスの計算リソースを最小限消費します。この消費量は通常ごくわずかですが、過度に高い QPS のリクエストをサーバーレスコンピューティングに送信することは避けてください。
-
汎用インスタンスの場合、このメタデータ処理はインスタンス自身の計算リソースを消費します。
-
仮想ウェアハウスインスタンスの場合、リーダー仮想ウェアハウスまたはフォロワー仮想ウェアハウスのどちらを介して接続するかにかかわらず、このメタデータ処理はリーダー仮想ウェアハウスの計算リソースを消費します。
セッションレベルの構成
SQL コマンドにサーバーレスリソースを使用するには、以下のステートメントを実行します。セッションレベルの構成を推奨します。
この方法は、以下のシナリオに適しています。
-
既存データの更新やテーブル構造・プロパティの変更 (REBUILD) など、1 回限りのインポートまたはクエリタスク。
-
M+1、T+1、または H+1 のオフラインデータ操作など、定期的なオフラインのインポートおよびエクスポートタスク。この構成を定期タスクに追加できます。
-
サーバーレスリソースを柔軟に利用する必要があるその他すべてのシナリオ。
-- サーバーレスコンピューティングリソースを使用して SQL を実行します。デフォルト値は local で、インスタンス自身のリソースが使用されることを意味します。
SET hg_computing_resource = 'serverless';
-- DML ステートメントを送信した後、構成をリセットして、後続の SQL ステートメントがサーバーレスリソースを使用しないようにします。
RESET hg_computing_resource;
-
このパラメーターをデータベースレベルで変更することは推奨しません。
-
RESET hg_computing_resource を実行して構成をリセットし、後続の SQL ステートメントがサーバーレスリソースを使用しないようにすることができます。
例:
-- データの準備
-- ソーステーブルの作成
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 パラメーターよりも優先度が高いですが、セッションレベルで設定されたものよりは低いです。詳細については、「GUC パラメーター」をご参照ください。
-- 特定のデータベース内で、ユーザーがデフォルトでサーバーレスリソース上で SQL ステートメントを実行するように構成します。
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 指紋を構成して、常にサーバーレスリソースを使用させることができます。
-
ストレージモード別:ホットまたはコールド。たとえば、コールドストレージに対するすべてのクエリをサーバーレスリソースにルーティングできます。
この機能を構成するには、以下のステートメントを実行します。
-
汎用インスタンス
-- ターゲットキュー内のすべてのクエリがサーバーレスリソースで実行されるように構成します。 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 ステートメントが過剰なリソースを消費するのを防ぎます。詳細については、「大規模クエリ制御」をご参照ください。
サーバーレスコンピューティングタスクの優先順位付け
Hologres では、サーバーレスコンピューティングにルーティングされる SQL ステートメントの優先度を設定できます。各 SQL ステートメントにリソース上限を設定し、優先度ベースのキューイングメカニズムを使用することで、サーバーレスコンピューティングに入るタスクが安定的かつ秩序正しく実行されることを保証します。
例:
ご利用のインスタンスが 32 コアで、利用可能な最大サーバーレスリソースが 96 コアであるとします。SQL A が現在実行中で、64 コアのサーバーレスリソースを使用しています。同時に、サーバーレスタスクキューには SQL B (48 コアを要求、優先度 5) と SQL C (32 コアを要求、優先度 3) が含まれています。この場合、システムは SQL A が完了するのを待ってから、残りの 32 コアを SQL C の実行に先に使用するのではなく、優先的に 48 コアを割り当てて SQL B を実行します。
-
以下のステートメントを実行して、サーバーレスリソースでの 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 ステートメントを実行します。
SET hg_computing_resource = 'serverless';
-- クエリプランを表示します。
EXPLAIN INSERT INTO sink_tbl SELECT * FROM source_tbl;
-- 構成をリセットします。
RESET hg_computing_resource;
このコマンドは以下の結果を返します。出力に Computing Resource: Serverless が含まれている場合、ステートメントはサーバーレスリソースを使用して実行されます。
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)
サーバーレスリソースで実行中および履歴タスクを表示するには、「サーバーレスコンピューティングの監視と管理」をご参照ください。