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任务。
Serverless Computing支持的函数Extension扩展如下:
ClickHouse
Flow Analysis
PostGIS
RoaringBitmap
BSI
Proxima
如下情况不支持Serverless Computing:
只读从实例的查询(主实例、计算组实例可正常使用)。
开启了多行DML事务的查询,如
set hg_experimental_enable_transaction = on
。使用Fixed Plan的SQL。
DLF外表查询与写入。
跨库查询与写入。
使用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监控与运维。