湖表镜像

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

是否开启外部表镜像能力。取值如下:

  • on:开启镜像能力。

  • off:关闭镜像能力。

data_mirroring_partition_num

指定分区表需要镜像的最近n个分区,仅分区表适用。取值如下:

  • all:全部分区。

  • 1~N: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时,需设置该参数。

使用方式

前提条件

开启外部表镜像

非分区

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'
  );