對於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外部表格查詢與寫入。
跨庫查詢與寫入。
加密表(包括內部表和外部表格)。
如果需要使用EXTENSION,現在僅支援如下EXTENSION:
ClickHouse
Flow Analysis
PostGIS
RoaringBitmap
BSI
Proxima
Hologres V2.2.14版本前,僅INSERT(不包括INSERT OVERWRITE)、INSERT ON CONFLICT(UPSERT)、DELETE和UPDATE的DML操作支援使用Serverless Computing。Hologres V2.2.14版本起,支援使用Serverless Computing執行DQL任務。V3.0版本起,DML中的COPY操作支援使用Serverless Computing。暫不支援CTAS、RESHARDING及INSERT OVERWRITE操作使用Serverless Computing。
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資源。
設定單條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;
更多操作
查看執行個體使用Serverless Computing的監控指標
您可通過以下方式查看Serverless Query最長運行時間長度、Serverless Computing Query排隊數量、Serverless Computing資源Quota使用率的監控指標。如有需要,可進一步配置監控警示,詳情請參見CloudMonitor。
在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)。
查看當前資料庫啟動並執行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數量。