Hologres 自V3.2版本起,新增湖表镜像功能,以加速湖上数据查询。该功能支持元数据与数据镜像,能够近实时或按指定时间间隔将外部数据源的变更同步至Hologres。此外,还支持全表镜像和分区表的部分镜像,可通过参数灵活控制镜像数据的范围。
功能详情
在通过Hologres访问湖表时,系统会自动触发元数据镜像同步任务,定期(默认为1分钟)从源表中同步最新元数据并缓存在Hologres中。再次访问时,将自动选择已镜像的元数据以实现Meta链路的访问加速。
对于湖表Data的镜像能力,需要使用ALTER EXTERNAL TABLE
命令手动开启,支持的能力如下:
支持对Paimon Append Table和带Deletion Vector的主键表开启镜像能力。
支持分区表、非分区表整表以及部分分区的镜像能力。
支持外部表Schema Evolution,支持的操作类型包括增加列、删除列、调整列顺序和重命名列,对于不支持的操作自动Fallback到直读外部表。
支持湖表分区的自动发现与同步。
支持对湖表镜像设置内表常用索引,使SQL在执行时快速命中数据,减少IO消耗,以更少的计算资源,实现更快的查询性能,详情请参见设置表属性和索引。支持的索引包括:
data_mirroring_clustering_key
data_mirroring_bitmap_columns
data_mirroring_dictionary_encoding_columns
支持使用主从实例、计算组实例和Serverless资源查询镜像数据。
支持查看镜像同步的进度。
支持查看完整镜像的最新分区。
支持查看实例级、DB级、表级的镜像存储量。
支持修改某个表的Data镜像配置。
支持对某个表关闭Data镜像功能。
限制条件
支持以
External Database
方式实现元数据映射的外部表,不支持以Foreign Table方式映射的外部表。支持通过DLF实现元数据管理的外部表。
暂不支持Paimon Branch分支数据镜像。
语法说明
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table>
SET(
-- 开启外部表镜像
data_mirroring_speed_up_enable = 'on|off',
[data_mirroring_partition_num='1~N|all',] |[data_mirroring_partition_list='pt1,pt2...',]
-- 指定镜像构建过程使用的资源
[data_mirroring_guc_hg_computing_resource='[serverless | local]',]
[data_mirroring_guc_hg_experimental_serverless_computing_required_cores='<num>',]
-- 设置索引
[data_mirroring_clustering_key='[columnName{:asc]} [,...]]',]
[data_mirroring_dictionary_encoding_columns='[columnName [,...]]',]
[data_mirroring_bitmap_columns='[columnName [,...]]',]
);
参数说明
参数名称 | 是否必填 | 说明 |
data_mirroring_speed_up_enable | 是 | 是否开启外部表镜像能力。取值如下:
|
data_mirroring_partition_num | 否 | 指定分区表需要镜像的最近n个分区,仅分区表适用。取值如下:
|
data_mirroring_partition_list | 否 | 指定需要镜像的分区List,仅分区表适用。 |
data_mirroring_guc_hg_computing_resource | 否 | 指定镜像构建过程使用的资源,默认为。 Serverless:指定数据镜像使用Serverless资源。 Local:默认值,指定只用当前实例资源。 |
data_mirroring_guc_hg_experimental_serverless_computing_required_cores | 否 | 指定Serverless资源需要的Core数。 说明 仅当data_mirroring_guc_hg_computing_resource参数选择Serverless时,需设置该参数。 |
使用方式
前提条件
已完成以下操作:
购买Hologres实例并开通数据湖加速服务。详情请参见OSS数据湖加速。
创建EXTERNAL DATABASE实现湖表元数据映射至Hologres,详情参见CREATE EXTERNAL DATABASE。
开启外部表镜像
非分区
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table>
SET(
-- 开启外部表镜像
data_mirroring_speed_up_enable = 'on',
-- 指定镜像构建过程使用的资源
data_mirroring_guc_hg_computing_resource='local'
-- 设置索引
data_mirroring_clustering_key='c_int:asc,c_char:desc,
data_mirroring_dictionary_encoding_columns='c_int:on,c_char:auto',
data_mirroring_bitmap_columns='c_int:on'
);
分区表
指定分区个数
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table> SET( -- 开启外部表镜像 data_mirroring_speed_up_enable = 'on', data_mirroring_partition_num='7', -- 指定镜像构建过程使用的资源 data_mirroring_guc_hg_computing_resource='serverless' data_mirroring_guc_hg_experimental_serverless_computing_required_cores='16', -- 设置索引 data_mirroring_clustering_key='c_int:asc,c_char:desc, data_mirroring_dictionary_encoding_columns='c_int:on,c_char:auto', data_mirroring_bitmap_columns='c_int:on' );
指定全部分区
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table> SET( -- 开启外部表镜像 data_mirroring_speed_up_enable = 'on', data_mirroring_partition_num='all', -- 指定镜像构建过程使用的资源 data_mirroring_guc_hg_computing_resource='local', -- 设置索引 data_mirroring_clustering_key='c_int:asc,c_char:desc, data_mirroring_dictionary_encoding_columns='c_int:on,c_char:auto', data_mirroring_bitmap_columns='c_int:on' );
指定分区List
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table> SET( -- 开启外部表镜像 data_mirroring_speed_up_enable = 'on', data_mirroring_partition_list='pt1,pt2...', -- 指定镜像构建过程使用的资源 data_mirroring_guc_hg_computing_resource='local', -- 设置索引 data_mirroring_clustering_key='c_int:asc,c_char:desc, data_mirroring_dictionary_encoding_columns='c_int:on,c_char:auto', data_mirroring_bitmap_columns='c_int:on' );
指定分区个数同时指定特定分区,用于保留历史分区镜像
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table> SET( -- 开启外部表镜像 data_mirroring_speed_up_enable = 'on', data_mirroring_partition_num='7', data_mirroring_partition_list='pt1', -- 指定镜像构建过程使用的资源 data_mirroring_guc_hg_computing_resource='local', -- 设置索引 data_mirroring_clustering_key='c_int:asc,c_char:desc, data_mirroring_dictionary_encoding_columns='c_int:on,c_char:auto', data_mirroring_bitmap_columns='c_int:on' );
查看镜像构建状态
您可通过如下命令查看镜像构建状态。
SELECT * FROM hologres.hg_datalake_get_mirror_status();
返回列表的字段介绍如下:
字段名称 | 说明 |
external_db_name | 镜像构建任务对应的表所在的External Database。 |
external_schema_name | 镜像构建任务对应的表所在的External Schema。 |
external_table_name | 镜像构建任务对应的External Table。 |
partition | 镜像构建任务对应的External Table中的分区。 |
mirror_data_size | 该表或者分区对应的镜像文件大小。 |
mirror_start_time | 镜像构建任务开始时间。 |
mirror_last_update_time | 镜像数据最近更新时间。 |
total_file_count | 总文件大小。 |
mirrored_file_count | 已镜像的文件大小。 |
修改镜像配置
ALTER EXTERNAL TABLE <ext_db.ext_schema.ext_table>
SET(
-- 开启外部表镜像
data_mirroring_speed_up_enable = 'on',
data_mirroring_partition_num='12'
);
查看查询是否用到镜像文件
explain analyze SELECT xx FROM <holo_ext_db.ext_schema.ext_table>;
返回结果如下。
QUERY PLAN
Gather (cost=0.00..5.80 rows=1000 width=116)
[128:1 id=100002 dop=1 time=26/26/26ms rows=107995(107995/107995/107995) mem=0/0/0B open=0/0/0ms get_next=26/26/26ms * ]
-> Local Gather (cost=0.00..5.01 rows=1000 width=116)
[id=2 dop=128 time=13/0/0ms rows=107995(97688/843/0) mem=0/0/0B open=0/0/0ms get_next=13/0/0ms local_dop=0/0/0]
-> Seq Scan on sls_ads_table (cost=0.00..5.01 rows=1000 width=116)
Foreign Table Type: DLF
[id=1 split_count=128 time=13/0/0ms rows=107995(97688/843/0) mem=37/5/4KB open=0/0/0ms get_next=13/0/0ms physical_reads=154(140/77/14) scan_rows=107995(97688/8999/671)]
ADVICE:
"[node id : 1] Table default."sls_ads_table" Miss Stats! please run 'analyze default."sls_ads_table"'. "
Query id:[1002007457093288810]
QE version: 2.0
Query Queue: init_warehouse.default_queue
======================cost======================
Total cost:[150] ms
Fast statistics cost:[0] ms
Optimizer cost:[73] ms
Build execution plan cost:[10] ms
Init execution plan cost:[9] ms
Start query cost:[13] ms
- Queue cost: [0] ms
- Wait schema cost:[0] ms
- Lock query cost:[0] ms
- Create dataset reader cost:[0] ms
- Create split reader cost:[3] ms
Get result cost:[45] ms
- Get the first block cost:[1] ms
====================resource====================
Memory: total 7 MB. Worker stats: max 3 MB, avg 3 MB, min 3 MB, max memory worker id: 1889346452478863373.
CPU time: total 96 ms. Worker stats: max 82 ms, avg 48 ms, min 14 ms, max CPU time worker id: 1889346412692090879.
DAG CPU time stats: max 77 ms, avg 38 ms, min 0 ms, cnt 2, max CPU time dag id: 1.
Fragment CPU time stats: max 66 ms, avg 25 ms, min 0 ms, cnt 3, max CPU time fragment id: 2.
Ec wait time: total 139 ms. Worker stats: max 79 ms, max(max) 2 ms, avg 69 ms, min 60 ms, max ec wait time worker id: 1889346452478863373, max(max) ec wait time worker id: 1889346412692090879.
Physical read bytes: total 1 MB. Worker stats: max 1 MB, avg 0 MB, min 0 MB, max physical read bytes worker id: 1889346412692090879.
Read bytes: total 7 MB. Worker stats: max 7 MB, avg 3 MB, min 0 MB, max read bytes worker id: 1889346412692090879.
DAG instance count: total 3. Worker stats: max 2, avg 1, min 1, max DAG instance count worker id: 1889346452478863373.
Fragment instance count: total 257. Worker stats: max 129, avg 128, min 128, max fragment instance count worker id: 1889346452478863373.
Meta mirror table count: use 1 miss 0.
Data mirror file count: use 12 miss 0.
返回结果中最后两个指标use和个数,代表命中了镜像。
关闭外部表镜像
关闭镜像之后,系统将不再同步数据至hologres,查询外部表会直接查询湖上数据,内部已镜像数据文件会在30分钟后异步删除。
ALTER EXTERNAL TABLE <holo_ext_db.ext_schema.ext_table> SET(
data_mirroring_speed_up_enable = 'off'
);