镜像加速

Hologres4.0版本开始支持为MaxCompute表开启镜像能力,开启后,Hologres近实时或基于用户指定时间间隔周期性同步数据至Hologres。外部数据源发生元数据或者数据变更,Hologres侧自动变更。支持全表镜像和分区表部分镜像,可通过指定参数来约束镜像数据范围。以下为您介绍镜像能力的详细用法。

功能详情

对于MaxComputeData的镜像能力,需要使用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镜像功能。

前提条件

注意事项

重要
  • 仅支持以External Database方式实现元数据映射的外表,不支持Import Foreign SchemaCreate 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

开启外部表镜像能力的开关

ON:打开镜像能力

OFF:关闭镜像能力

data_mirroring_partition_num

指定分区表需要镜像的最近n个分区,仅分区表适用

ALL:全部分区

1~N:n个分区

data_mirroring_partition_list

指定需要镜像的分区List,仅分区表适用

分区名

data_mirroring_guc_hg_computing_resource

指定镜像构建过程使用的资源

Serverless :指定数据镜像使用Serverless Task

Local:默认值,指定使用当前实例资源

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

执行结果如下:

image.png

参数说明

参数名称

描述

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;