对于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;
设置查询队列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。
查看当前数据库运行的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数量。