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時,需設定該參數。 |
使用方式
前提條件
已開通2.5及以上版本的DLF服務並建立Paimon Catalog。
已完成以下操作:
購買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'
);查看鏡像配置
可通過如下SQL查看哪些表配置了資料鏡像。
SELECT * FROM hologres.hg_datalake_get_mirror_config();查看鏡像進度
可通過如下SQL查看鏡像進行的進度。
SELECT *
FROM hologres.hg_user_datalake_mirror_cron_tasks
WHERE command::jsonb->>'external_db_name'='external_database_name'
ORDER BY start_time DESC;其中external_database_name為 External Database的名稱。