對于CPU或內存開銷大的SQL作業,Hologres Serverless Computing功能支持其使用獨立的Serverless Computing資源,以確保任務間資源隔離,避免資源競爭與相互干擾。本文將介紹如何使用Serverless Computing功能。
前提條件
實例類型為:通用型或計算組型。
地域和可用區為:華東1(杭州)的可用區J、 華南1(深圳)的可用區F和可用區D、華東2(上海)的可用區E、華北2(北京)的可用區I、中國(香港)的可用區B、新加坡的可用區A和可用區C。
說明上述地域其他可用區不支持,如有需要,請提交工單或加入實時數倉Hologres交流群,申請遷移可用區。目前可用區支持熱遷移,實例影響與熱升級相同,詳情請參見實例升級。
實例版本為:Hologres V2.1.17及以上版本。
說明如果您的實例是V2.1.17以下版本,請您使用實例升級或加入實時數倉Hologres交流群,申請升級實例,詳情請參見如何獲取更多的在線支持?。
使用限制
以下情況不支持使用Serverless Computing:
不支持只讀從實例的查詢。主實例、計算組實例可正常使用。
開啟了多行DML事務的查詢,如
set hg_experimental_enable_transaction = on
。使用Fixed Plan的SQL。
DLF外部表查詢與寫入。
跨庫查詢與寫入。
加密表(包括內部表和外部表)。
Serverless Computing現已支持如下任務:
支持主要的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)任務。
暫不支持RESHARDING、INSERT OVERWRITE任務。
如果需要使用EXTENSION,現在僅支持如下EXTENSION:
ClickHouse
Flow Analysis
PostGIS
RoaringBitmap
BSI
Proxima
Hologres實例可申請的Serverless Computing資源量(以下簡稱Quota)受實例計算資源限制,對應關系如下表。
說明Quota表示每個實例執行階段(EXECUTE)的SQL所占用的Serverless Computing資源的上限。
每個可用區的Serverless Computing資源池由當前可用區所有實例共享。
超過實例Quota限制或Serverless Computing資源池已滿的情況下,提交的SQL會排隊(進入QUEUE狀態)等待資源。
Serverless Computing資源池中的SQL執行期間,申請到的計算資源由當前SQL獨享,不會同時執行其他SQL。
實例計算資源(CU)
Serverless Computing資源Quota
實例計算資源<32
不支持使用Serverless Computing。
32=<實例計算資源<688
Serverless Computing資源Quota為實例計算資源的3倍。例如32CU的實例,可用的Serverless Computing資源Quota=32*3=96 CU。
實例計算資源>=688
支持最高達到2048CU的資源配額。
開啟Serverless Computing
新購實例
訪問Hologres實例列表,單擊新增引擎實例,在實例購買頁面,設置開啟Serverless Computing參數為是。關于新購實例詳情,請參見購買Hologres。
存量實例
訪問Hologres實例列表,在頂部菜單欄左側選擇地域,選擇目標實例,單擊操作列中的升配,在變配頁面,設置開啟Serverless Computing參數選為是。
開啟Serverless Computing配置期間會重啟實例,請盡量在業務低峰期執行變配操作,建議應用具備重連機制。升配計算資源配置涉及計算資源重新分配,元數據變更等操作,通常需要2~5分鐘,請您耐心等待。
關閉Serverless Computing
您可以訪問Hologres實例列表,在頂部菜單欄左側選擇地域,選擇目標實例,單擊操作列中的升配,在變配頁面,設置開啟Serverless Computing參數選為否。
關閉Serverless Computing配置期間會重啟實例,請盡量在業務低峰期執行變配操作,建議應用具備重連機制。升配計算資源配置涉及計算資源重新分配,元數據變更等操作,通常需要2~5分鐘,請您耐心等待。
Serverless Computing關閉后,不支持指定Serverless Computing資源,當前Serverless Computing資源中運行和排隊的任務都會失敗。
使用建議
建議使用Serverless Computing資源執行SQL時,同時Session級別配置活躍Query運行超時時間,以避免SQL運行時間過長或者等待時間過長,導致堵塞后續所有任務。
語法示例
set statement_timeout = <time>;
參數說明
time:超時時間取值范圍為0~2147483647ms,單位默認為ms(當time后加單位時需要使用單引號,否則會報錯)。默認超時時間為8小時。
使用示例
-- 使用 Serverless Computing 資源執行 SQL. SET hg_computing_resource = 'serverless'; -- 設置該SQL的優先級是5. SET hg_experimental_serverless_computing_query_priority to 5; --設置活躍query超時時間是2小時. SET statement_timeout = '2h'; -- 執行 SQL. INSERT INTO sink_tbl SELECT * FROM source_tbl; -- 重置配置 reset hg_computing_resource; reset statement_timeout;
使用Serverless Computing資源執行SQL
您可以通過執行如下代碼,使用Serverless Computing資源執行SQL命令。
-- 使用Serverless Computing資源執行SQL,默認值為local,表示使用本實例資源執行SQL。 SET hg_computing_resource = 'serverless'; --提交DML后重置配置,保證非必要的SQL不會使用serverless資源。 reset hg_computing_resource;
重要建議Session級別設置,請勿在數據庫級別修改該參數。
建議提交DML后,使用
reset hg_computing_resource
重置資源,重置后的SQL將在本地執行,保證非必要的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-- SET hg_computing_resource = 'serverless'; --執行SQL INSERT INTO sink_tbl SELECT * FROM source_tbl; -- 重置配置 reset hg_computing_resource;
您可以執行以下代碼,查看上述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
:表示使用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)
高級操作
通過對單條SQL設置可使用的資源量上限以及按優先級的排隊機制,保障進入Serverless Computing資源的SQL能穩定有序的執行。
在Hologres Serverless Computing中,單條SQL可使用的Serverless Computing資源量由以下三個參數決定。系統會取三個參數的最小值為單條SQL申請資源。
參數
說明
Quota
Hologres實例可使用的Serverless Computing資源上限,詳情請參見設置單條SQL的Serverless Computing資源上限。
hg_experimental_serverless_computing_max_cores
每條SQL可被分配的Serverless Computing資源上限,默認為512 CU,支持修改。
hg_experimental_serverless_computing_required_cores
系統自動估算該SQL需要使用的Serverless Computing資源量,支持修改,修改后系統不再自動估算。
同時,Hologres還支持為Serverless Computing資源中執行的SQL設置優先級。優先級取值范圍1~5,5為最高優先級,默認優先級為3。
示例場景:
假設現有Hologres實例規格為32 CU,該實例可使用的Serverless Computing資源上限為96 CU。當SQL A正在使用Serverless Computing的64 CU資源運行,同時,Serverless任務隊列中已有SQL B(需要申請48 CU資源,優先級5)、SQL C(需要申請32 CU資源,優先級3)等待運行。此時,系統會等待SQL A執行完成后優先申請48 CU資源用于執行SQL B,而非先使用剩余的32 CU資源來執行SQL C。
設置單條SQL的Serverless Computing資源上限
您可以執行如下代碼,設置每條SQL被分配的Serverless Computing資源上限。
-- 配置單個Serverless Computing分配的最大CU,默認為512。 SET hg_experimental_serverless_computing_max_cores = 512; -- 重置配置 reset hg_experimental_serverless_computing_max_cores;
使用示例
-- 使用Serverless Computing資源執行SQL SET hg_computing_resource = 'serverless'; -- 設置單條SQL最多使用32CU執行 SET hg_experimental_serverless_computing_max_cores = 32; -- 執行SQL INSERT INTO sink_tbl SELECT * FROM source_tbl; -- 重置配置 reset hg_computing_resource; reset hg_experimental_serverless_computing_max_cores;
建議數據庫級別設置。
實際分配時,系統會根據SQL的復雜程度自動分配資源。
實際執行時會取
hg_experimental_serverless_computing_max_cores
和Quota的最小值作為上限,評估SQL需要使用的Serverless Computing資源。實際申請資源的步長為15 CU。
設置單條SQL的Serverless Computing資源分配
針對hg_experimental_serverless_computing_required_cores
參數,系統會根據SQL的復雜程度自動估算需要的資源量。系統自動估算出的資源量可以有效平衡Serverless資源利用和SQL執行時長。若需某條SQL能夠分配到更多的Serverless Computing資源,您可通過設置hg_experimental_serverless_computing_required_cores
參數進行Serverless Computing資源分配。
您可以執行如下代碼,設置單個SQL語句在執行時所分配的Serverless Computing資源。
-- 默認為0,表示該Serverless Computing的計算資源由系統自動估算 SET hg_experimental_serverless_computing_required_cores = XX; -- 重置配置 reset hg_experimental_serverless_computing_required_cores;
使用示例
--使用Serverless Computing資源執行SQL SET hg_computing_resource = 'serverless'; --Serverless Computing的計算資源不由系統估算,申請96CU的計算資源 SET hg_experimental_serverless_computing_required_cores = 96; -- 執行SQL INSERT INTO sink_tbl SELECT * FROM source_tbl; -- 重置配置 reset hg_computing_resource; reset hg_experimental_serverless_computing_required_cores;
建議Session級別設置,請勿在數據庫級別修改該參數。
實際執行時,會取Quota、
hg_experimental_serverless_computing_required_cores
和hg_experimental_serverless_computing_max_cores
的最小值來申請資源。
設置單條SQL的Serverless Computing資源的優先級
您可以執行如下代碼,設置Serverless Computing資源中SQL執行的優先級。
-- 優先級范圍為 [1, 5], 數值越大,優先級越高,越優先分配資源(和分配資源數量無關) -- 默認優先級為3. SET hg_experimental_serverless_computing_query_priority to 5; -- 重置配置 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;
設置用戶/角色的全部SQL默認通過Serverless Computing執行
您可以執行如下代碼,針對某一用戶/角色,使其發起的全部SQL均默認使用Serverless Computing資源執行。
--針對某用戶在某DB下,默認使用Serverless Computing資源執行SQL
ALTER USER <user_name> IN DATABASE <db_name> SET hg_computing_resource = 'serverless';
該配置方法的優先級高于數據庫級別配置GUC,低于Session級別配置GUC,詳情請參見GUC參數。
若需要取消上述配置,請執行代碼
ALTER USER <user_name> IN DATABASE <db_name> RESET hg_computing_resource;
設置查詢隊列Query Queue的全部SQL通過Serverless Computing執行
您可以執行如下代碼,以針對某一查詢隊列,使其所有SQL語句均使用Serverless Computing資源執行。有關查詢隊列的配置方法,詳情請參見Query Queue(Beta)。
如果實例所在可用區不支持Serverless Computing,仍將使用本實例計算資源執行。
通用型實例
-- 設置目標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 Computing的監控指標
您可通過以下方式查看Serverless Query最長運行時長、Serverless Computing Query排隊數量、Serverless Computing資源Quota使用率的監控指標。如有需要,可進一步配置監控告警,詳情請參見云監控。
在Hologres管理控制臺頂部菜單欄,選擇目標地域。
單擊左側導航欄的實例列表。
在實例列表頁面單擊目標實例名稱,進入實例詳情頁。
您也可以單擊目標實例操作列的管理,進入實例詳情頁。
在實例詳情頁左側導航欄,單擊監控信息,查看監控指標。
查看Serverless Computing資源中SQL任務的運行狀態
查看Serverless Computing資源中正在運行的SQL任務。
SELECT *, (running_info::json) ->> 'computing_resource' AS computing_resource, (running_info::json) ->> 'current_stage' AS current_stage FROM hg_stat_activity WHERE (running_info::json) ->> 'computing_resource' = 'Serverless' AND (running_info::json) -> 'current_stage'->>'stage_name' = 'EXECUTE'
查看Serverless Computing資源中排隊的SQL任務。
SELECT *, (running_info::json) ->> 'computing_resource' AS computing_resource, (running_info::json) ->> 'current_stage' AS current_stage FROM hg_stat_activity WHERE (running_info::json) ->> 'computing_resource' = 'Serverless' AND (running_info::json) -> 'current_stage'->>'stage_name' = 'QUEUE'
查看Serverless Computing資源中SQL任務的運行狀態。
SELECT *, (running_info::json) ->> 'computing_resource' AS computing_resource, (running_info::json) ->> 'current_stage' AS current_stage FROM hg_stat_activity WHERE query_id = '<query_id>';
查詢歷史的Serverless Computing任務
在慢Query日志中查看在Serverless Computing資源中執行的歷史任務。
SELECT *, extended_cost::json ->> 'queue_time_ms' AS queue_time_ms,--Serverless Computing資源中SQL等待排隊時長。 extended_cost::json ->> 'serverless_allocated_cores' AS serverless_allocated_cores,--Serverless Computing資源分配給當前SQL的CU數。 extended_cost::json ->> 'serverless_allocated_workers' AS serverless_allocated_workers,--Serverless Computing資源分配給當前SQL的Worker數。 extended_cost::json ->> 'serverless_resource_used_time_ms' AS serverless_resource_used_time_ms--當前SQL實際占用Serverless Computing資源的時長。 FROM hologres.hg_query_log WHERE query_extinfo @> ARRAY['serverless_computing'::text];
在
hologres.hg_serverless_computing_query_log
視圖中查看在Serverless Computing資源中執行的歷史任務。SELECT * FROM hologres.hg_serverless_computing_query_log;
說明自2.1.18版本開始,為了方便查詢,將慢Query日志中Serverless Computing任務相關內容固化為列,并且新增了
hologres hg_serverless_computing_query_log
視圖。相對于慢Query日志hologres.hg_serverless_computing_query_log
視圖中新增以下字段:queue_time_ms
:Serverless Computing資源中SQL等待排隊時長,單位毫秒(ms)。serverless_allocated_cores
:Serverless Computing資源實際分配給當前SQL的CU數。serverless_allocated_workers
:Serverless Computing資源實際分配給當前SQL的Worker數。serverless_resource_used_time_ms
:當前SQL實際占用Serverless Computing資源的時長,單位毫秒(ms)。extended_info
字段中新增以下信息:serverless_computing_source
:表示SQL來源,表示使用Serverless Computing資源執行的SQL。取值如下:user_submit
:自行指定使用Serverless資源執行的SQL,與Query Queue無關。query_queue
:指定查詢隊列的SQL全部由Serverless資源執行。query_queue_rerun
:通過Query Queue的大查詢控制功能,自動使用Serverless資源重新運行的SQL。
query_id_of_triggered_rerun
:該字段僅在serverless_computing_source為query_queue_rerun時存在,表示重新運行的SQL對應的原始Query ID。
針對部分特殊任務,如COPY、CTAS等,在慢Query日志中會產生多條記錄,包括COPY或CTAS本身及其過程中產生的INSERT記錄,其中的INSERT會實際使用Serverless資源執行??梢酝ㄟ^COPY或CTAS的trans_id字段關聯到INSERT記錄,關聯示例如下。
SELECT query_id, query, extended_info FROM hologres.hg_query_log WHERE extended_info ->> 'source_trx' = '<transaction_id>' -- 通過COPY/CTAS等本身記錄的trans_id字段可以取到transaction id ORDER BY query_start ;
查看當前數據庫運行的SQL占用的Serverless Computing資源
查看Serverless Computing資源中正在運行的SQL任務占用的總資源量。
SELECT datname::text as db_name, (running_info::json) -> 'current_stage' ->> 'stage_name' AS current_stage, SUM(((running_info::json) -> 'current_stage' ->> 'serverless_allocated_cores')::int) AS total_computing_resource, count(1) as query_qty FROM hg_stat_activity WHERE (running_info::json) ->> 'computing_resource' = 'Serverless' GROUP BY 1, 2;
返回結果字段說明
字段
描述
db_name
數據庫名稱。
current_stage
當前SQL執行階段。
PARSE:SQL解析。
OPTIMIZE:生成執行計劃。
QUEUE:等待資源。
START:Query開始階段。
EXECUTE:Query執行階段。
FINISH:Query完成。
total_computing_resourcet
在當前數據庫和SQL執行階段,使用的Serverless Computing資源總量。
query_qty
SQL數量。