Hologres自V2.1.17版本起支援Serverless Computing功能。本文為您介紹如何使用Hologres的Serverless Computing功能執行任務。
Serverless Computing支援的功能範圍
Serverless Computing支援的任務類型如下:
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版本起,支援DML中的CREATE TABLE AS(CTAS)任務。
V2.2.42/V3.0.19版本起,支援RESHARDING任務。
V3.0.26版本起,支援DML中的INSERT OVERWRITE任務(預存程序hg_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版本起,支援Compaction任務,詳情請參見使用Serverless Computing執行Compaction任務。
V4.0版本起,支援讀寫DLF外表,檔案格式與其他注意事項見OSS資料湖加速。
Serverless Computing支援的函數Extension擴充如下:
ClickHouse
Flow Analysis
PostGIS
RoaringBitmap
BSI
Proxima
如下情況不支援Serverless Computing:
唯讀從執行個體的查詢(主執行個體、計算群組執行個體可正常使用)。
開啟了多行DML事務的查詢,如
set hg_experimental_enable_transaction = on。使用Fixed Plan的SQL。
跨庫查詢與寫入。
使用Serverless Computing資源執行讀寫任務
Hologres支援您靈活使用Serverless Computing資源。您可按需將單條SQL指向Serverless資源執行,或設定規則使用Serverless資源批量執行SQL。
Hologres支援如下使用方式,在SQL執行前便將其調度到Serverless資源中,按優先順序由高到低生效:
SQL層級(Session層級):設定
hg_computing_resource參數為'serverless',當前串連的讀寫請求將使用Serverless資源執行。使用者層級:使用者層級設定
hg_computing_resource參數為'serverless',使用Serverless資源執行。查詢隊列Query Queue層級:設定查詢隊列中的全部任務均使用Serverless資源執行。
自適應Serverless計算:開啟後,系統自動判斷“大任務”,自動使用Serverless資源執行。
不符合上述條件,則使用本執行個體資源執行。
SQL執行中,也支援配置大查詢自動使用Serverless資源重跑,以減輕實際生產業務的負載壓力、降低OOM頻率,並提升系統穩定性。
使用Serverless資源執行SQL期間,計算資源由當前SQL獨享,不會同時執行其他SQL。
SQL層級配置
該方式常用於如下情境:
一次性的匯入或查詢任務,如歷史資料重新整理、表結構/屬性修改(Rebuild)等。
周期性的離線匯入任務,如M+1、T+1、H+1的離線資料匯入匯出,可在調度任務中增加該配置。
其他所有需要靈活使用Serverless資源的情境。
您可以通過執行如下代碼,使用Serverless Computing資源執行SQL命令,推薦SESSION層級設定。
-- 使用Serverless Computing資源執行SQL,預設值為local,表示使用本執行個體資源執行SQL。
SET hg_computing_resource = 'serverless';
-- 提交DML後重設配置,保證非必要的SQL不會使用serverless資源。
RESET hg_computing_resource;不建議資料庫層級修改。
可通過RESET hg_computing_resource重設配置,保證非必要的SQL不會使用Serverless資源。
使用樣本:
-- 資料準備 --
-- 建立源表
CREATE TABLE source_tbl ( id int );
-- 建立目標表
CREATE TABLE sink_tbl ( id int );
-- 源表寫入範例資料
INSERT INTO source_tbl
SELECT * FROM generate_series(1, 99999999);
-- 使用Serverless Computing資源執行SQL --
-- Session層級開啟開關
SET hg_computing_resource = 'serverless';
-- 執行SQL
INSERT INTO sink_tbl SELECT * FROM source_tbl;
-- 重設配置
RESET hg_computing_resource;使用者層級配置
該方式常用於如下情境:
進階別使用者的日常使用(如Superuser)。
高優先順序的資料大屏,可對大屏對應資料來源中的帳號進行配置。
您可以執行如下代碼,針對某一USER或ROLE,使其發起的全部SQL均預設使用Serverless Computing資源執行。
該配置方法的優先順序高於資料庫層級配置GUC,低於Session層級配置GUC,詳情請參見GUC參數。
-- 針對某使用者在某DB下,預設使用Serverless Computing資源執行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;查詢隊列Query Queue層級配置
Hologres支援針對某一查詢隊列,使其全部SQL均使用Serverless Computing資源執行。查詢隊列的配置詳情,請參見查詢隊列Query Queue。通過該功能,您可以藉助查詢隊列Query Queue的分類器能力,實現“某類SQL”全部使用Serverless資源執行,例如:
按查詢類型:INSERT、SELECT、UPDATE、DELETE等。
按查詢引擎:HQE、PQE、SQE、HiveQE,例如所有的MaxCompute外表非直讀任務(即SQE)均使用Serverless資源。
按SQL指紋:如果某個查詢pattern資源開銷較大,有穩定性風險,可設定對應的SQL指紋均使用Serverless資源。
按儲存模式:hot、cold,例如所有的冷存查詢均使用Serverless資源。
您可以執行如下代碼進行配置:
通用型執行個體
-- 設定目標Queue中的查詢全部通過Serverless資源運行 CALL hg_set_query_queue_property('<query_queue_name>', 'computing_resource', 'serverless'); -- (可選)設定目標Queue中的查詢使用Serverless資源時的優先順序,支援1-5,預設為3 CALL hg_set_query_queue_property('<query_queue_name>', 'query_priority_when_using_serverless_computing', '<priority>');計算群組執行個體
-- 設定目標Queue中的查詢全部通過Serverless資源運行 CALL hg_set_query_queue_property('<warehouse_name>', '<query_queue_name>', 'computing_resource', 'serverless'); -- (可選)設定目標Queue中的查詢使用Serverless資源時的優先順序,支援1-5,預設為3 CALL hg_set_query_queue_property('<warehouse_name>', '<query_queue_name>', 'query_priority_when_using_serverless_computing', '<priority>');
自適應Serverless計算
Hologres支援自動判斷系統中的“大任務”,自動將“大任務”指向Serverless資源執行。詳情請參見自適應Serverless計算。
“大任務”自動重跑
如果SQL已經使用本執行個體資源執行,為進一步提升系統穩定性,避免正在啟動並執行SQL佔用系統過多資源,支援定義“執行時間長度超過x秒”或“出現OOM”的SQL為“大查詢”,並自動使用Serverless資源重跑該部分SQL。詳情請參見大查詢控制。
設定Serverless Computing任務的優先順序
Hologres支援為進入Serverless Computing的SQL設定優先權。通過設定單條SQL可使用的資源量上限與按優先順序的排隊機制,保障進入Serverless Computing的SQL穩定有序執行。
以如下情境為例:
您的執行個體規格為32 cores,執行個體可使用的Serverless Computing資源上限為96 cores。有SQL A正在使用Serverless的64 cores資源運行中。同時,Serverless任務隊列中有SQL B(需要申請48 cores資源,優先順序5)、SQL C(需要申請32 cores資源,優先順序3)。此時,系統會等待SQL A執行完成後優先申請48 cores資源用於執行SQL B,而非先使用剩餘的32 cores資源來執行SQL C。
您可以執行如下代碼,設定Serverless Computing資源中SQL執行的優先順序。
優先順序範圍為 [1, 5],預設值為3。數值越大,優先順序越高,越優先分配資源(和分配資源數量無關)。
-- Session層級配置 SET hg_experimental_serverless_computing_query_priority = 5; -- 重設配置 RESET hg_experimental_serverless_computing_query_priority; -- User層級配置 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;使用樣本
-- 使用Serverless Computing資源執行 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;
Serverless Computing驗證
您可以執行以下代碼,查看上述SQL執行計畫。
-- 使用Serverless Computing資源執行SQL
SET hg_computing_resource = 'serverless';
-- 執行SQL
EXPLAIN INSERT INTO sink_tbl SELECT * FROM source_tbl;
-- 重設配置
RESET hg_computing_resource;返回結果如下。返回結果中出現Computing Resource: Serverless,表示該SQL使用Serverless Computing資源執行。
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)您還可查看Serverless資源中正在啟動並執行任務以及歷史任務,詳情請參見Serverless Computing監控與營運。