Hologres自4.0版本开始支持为MaxCompute表开启镜像能力,开启后,Hologres近实时或基于用户指定时间间隔周期性同步数据至Hologres。外部数据源发生元数据或者数据变更,Hologres侧自动变更。支持全表镜像和分区表部分镜像,可通过指定参数来约束镜像数据范围。以下为您介绍镜像能力的详细用法。
功能详情
对于MaxCompute表Data的镜像能力,需要使用ALTER EXTERNAL TABLE命令手动开启,支持的能力如下:
支持对MaxCompute普通表(除Append2.0、ACID1.0、Delta Table以外的MaxCompute表)开启镜像能力。
支持分区表和非分区表整表以及部分分区的镜像能力。
开启数据镜像的时,需要设置
set hg_experimental_maxcompute_sdk_split_file_num_limit = 1以确保split的稳定性。支持外部表Schema Evolution,支持的操作类型包括增加列、删除列、调整列顺序、重命名列,对于不支持的操作自动fallback到直读外表,另外,如果发生Schema Evolution,会自动重新开始镜像。
支持MaxCompute表分区的自动发现与同步。
支持对湖表镜像设置内表常用索引,使SQL在执行时快速命中数据,减少IO消耗,以更少的计算资源,实现更快的查询性能,详见CREATE TABLE。支持的索引包括:
data_mirroring_clustering_key
data_mirroring_bitmap_columns
data_mirroring_dictionary_encoding_columns
支持使用主从实例、计算组实例和Serverless资源查询镜像数据。
支持查看镜像同步的进度。
支持查看实例级、DB级、表级的镜像存储量。
支持修改某个表的Data镜像配置。
支持对某个表关闭Data镜像功能。
前提条件
已开通Hologres实例,详情请参见购买Hologres。
已开通MaxCompute并创建项目,详情请参见开通MaxCompute。
已为用户授予访问MaxCompute项目和表的权限,详情请参见通过命令管理用户权限。
注意事项
仅支持以External Database方式实现元数据映射的外表,不支持Import Foreign Schema和Create Foreign Table方式创建的外表。
不支持对MaxCompute Append2.0、ACID1.0、Delta Table三种类型的表开启镜像能力。
MaxCompute表中不能包含Hologres不支持的数据类型,否则会导致镜像失败,Hologres支持的数据类型详见数据类型汇总。
语法说明
SQL命令如下:
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 | 指定镜像构建过程使用的资源 | 否 |
|
data_mirroring_guc_hg_experimental_serverless_computing_required_cores | 指定Serverless资源需要的Core数 | 否 | 数值类型:正整数。当且仅当data_mirroring_guc_hg_computing_resource参数选择Serverless时,需设置该参数。 |
使用方式
创建External Database
创建External Database 实现MaxCompute表元数据映射至Hologres,详情参见CREATE EXTERNAL DATABASE。
SQL命令如下:
-- 全局开启bigmeta链路
alter role all set hg_experimental_enable_big_meta_on_maxcompute_sdk = on;
-- 全局开启CommonTable直读链路,仅升级到4.0版本的实例需要手动开启,新购实例不需要,已默认开启
alter role all set hg_experimental_external_catalog_routing = 'odps:common_table';
-- 生成稳定数据分片
alter role all set hg_experimental_maxcompute_sdk_split_file_num_limit = 1;
-- 创建External Database
CREATE EXTERNAL DATABASE ext_db WITH
metastore_type 'maxcompute'
mc_project '<mc_project_name>'
;开启外部表镜像
非分区表
SQL命令如下:
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'
);分区表
指定分区个数
SQL命令如下:
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'
);指定全部分区
SQL命令如下:
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
SQL命令如下:
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'
);指定分区个数同时指定特定分区,用于保留历史分区镜像
SQL命令如下:
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'
);查看镜像构建状态
SQL命令如下:
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 | 已镜像的文件个数 |
修改镜像配置
SQL命令如下:
alter external table <ext_db.ext_schema.ext_table>
set(
-- 开启外部表镜像
data_mirroring_speed_up_enable = 'on',
data_mirroring_partition_num='12'
);查看查询是否用到镜像文件
使用 explain analyze查看执行计划,在结果中通过Meta mirror table count 和 Data mirror file count查看镜像命中情况。
SQL命令如下:
explain analyze select xx from <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.关闭外部表镜像
SQL命令如下:
alter external table <ext_db.ext_schema.ext_table>
set(
data_mirroring_speed_up_enable = 'off'
);关闭镜像之后,系统将不再同步数据至Hologres内部,查询外表会直接查询湖上数据,内部已镜像数据文件会在30分钟后异步删除。
查看镜像配置
SQL命令如下:
SELECT * FROM hologres.hg_datalake_get_mirror_config();查看镜像进度
可以使用如下SQL查看进行的进度,其中external_database_name就是 External Database 的名称。
SQL命令如下:
SELECT *
FROM hologres.hg_user_datalake_mirror_cron_tasks
WHERE command::jsonb->>'external_db_name'='<ext_db>'
ORDER BY start_time DESC;