全部產品
Search
文件中心

Hologres:Serverless Computing使用指南

更新時間:Nov 21, 2024

對於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

image

存量執行個體

訪問Hologres執行個體列表,在頂部功能表列左側選擇地區,選擇目標執行個體,單擊操作列中的升配,在變更配置頁面,設定開啟Serverless Computing參數選為

重要

開啟Serverless Computing配置期間會重啟執行個體,請盡量在業務低峰期執行變更配置操作,建議應用具備重連機制。升配計算資源配置涉及計算資源重新分配,中繼資料變更等操作,通常需要2~5分鐘,請您耐心等待。

image

關閉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_coreshg_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使用率的監控指標。如有需要,可進一步配置監控警示,詳情請參見CloudMonitor

  1. 登入Hologres管理主控台

  2. 在Hologres管理主控台頂部功能表列,選擇目標地區。

  3. 單擊左側導覽列的執行個體列表

  4. 執行個體列表頁面單擊目標執行個體名稱,進入執行個體詳情頁。

    您也可以單擊目標執行個體操作列的管理,進入執行個體詳情頁。

  5. 在執行個體詳情頁左側導覽列,單擊監控資訊,查看監控指標。

查看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。

查看當前資料庫啟動並執行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數量。