外部表自動(dòng)加載(Auto Load)
本文為您介紹如何使用Auto Load外部表自動(dòng)加載的功能,實(shí)現(xiàn)MaxCompute和OSS數(shù)據(jù)的按需自動(dòng)加載以及全量自動(dòng)加載。
應(yīng)用場(chǎng)景
Hologres與云原生大數(shù)據(jù)計(jì)算服務(wù)MaxCompute、阿里云數(shù)據(jù)湖構(gòu)建(Data Lake Formation,DLF)和阿里云對(duì)象存儲(chǔ)(Object Storage Service,OSS)深度兼容,無(wú)需數(shù)據(jù)搬遷,即可通過外部表加速查詢存儲(chǔ)于MaxCompute或OSS的數(shù)據(jù)。當(dāng)需要加速的外部表較多時(shí),您可以通過自動(dòng)加載功能自動(dòng)同步MaxCompute和DLF元數(shù)據(jù),自動(dòng)創(chuàng)建Hologres外部表,降低手動(dòng)創(chuàng)建外部表的成本。
外部表按需加載:主要適用于數(shù)據(jù)源表數(shù)量較少且需要加速查詢的場(chǎng)景。當(dāng)此功能開啟后,Hologres在查詢MaxCompute或OSS中的同名表時(shí),會(huì)自動(dòng)創(chuàng)建相應(yīng)的Hologres外部表,以加速數(shù)據(jù)查詢。
說(shuō)明當(dāng)Hologres自動(dòng)加載相應(yīng)MaxCompute或OSS的外部表時(shí),如果Hologres內(nèi)部已經(jīng)存在同名的Schema和Table,自動(dòng)加載功能將不會(huì)觸發(fā),而是會(huì)查詢Hologres的內(nèi)部表。
由于自動(dòng)加載時(shí)會(huì)創(chuàng)建相應(yīng)的外部表,因此要求查詢的賬號(hào)必須具備在對(duì)應(yīng)數(shù)據(jù)庫(kù)中創(chuàng)建和刪除Schema及Table的權(quán)限。但如果外部表已經(jīng)通過自動(dòng)加載創(chuàng)建完成,那么只需要查詢權(quán)限就能進(jìn)行后續(xù)的操作。
該功能僅在查詢時(shí)觸發(fā)外部自動(dòng)加載,不會(huì)周期性加載。
外部表全量加載:主要適用于數(shù)據(jù)源表數(shù)量較多或多個(gè)數(shù)據(jù)源,且需要加速查詢的場(chǎng)景。在此功能開啟后,查詢時(shí)系統(tǒng)會(huì)自動(dòng)創(chuàng)建與數(shù)據(jù)源匹配的外部表,從而實(shí)現(xiàn)所有數(shù)據(jù)源表的全面映射。此外,一旦數(shù)據(jù)全量加載完成,可通過參數(shù)設(shè)置定期檢查,確保在查詢時(shí)能自動(dòng)創(chuàng)建新添加的外部表。這優(yōu)化了對(duì)大量外部表的管理,特別適用于需要提升BI查詢效率的環(huán)境。
功能簡(jiǎn)介
自Hologres V1.1.43版本開始,支持MaxCompute外部表自動(dòng)加載,此時(shí)僅支持MaxCompute兩層模型數(shù)據(jù)源。
自Hologres V1.3.28版本開始,為了降低自動(dòng)巡檢的系統(tǒng)資源消耗,外部表全量加載的周期性巡檢
hg_experimental_load_all_foreign_table_interval_time
參數(shù)默認(rèn)值由5 min
變?yōu)?span data-tag="ph" id="codeph-5n2-w6v-i65" class="ph">30 min
。自Hologres V2.2.1版本開始,支持以下功能。若您的實(shí)例為V2.1或以下版本,可聯(lián)系Hologres技術(shù)支持升級(jí)實(shí)例。
外部表自動(dòng)加載新增
hg_experimental_load_foreign_table_mode = ['query' | 'period']
來(lái)控制外部表自動(dòng)加載的模式。外部表自動(dòng)加載支持MaxCompute三層模型項(xiàng)目數(shù)據(jù)。MaxCompute三層模型詳情請(qǐng)參見Schema操作。
外部表自動(dòng)加載支持MaxCompute外部表的Schema Evolution(如增加列、刪除列、修改列名及列順序)。
針對(duì)已加載的Hologres外部表,如果外部數(shù)據(jù)源有表結(jié)構(gòu)變更,可使用如下GUC來(lái)開啟外部表Schema Evolution檢查。 開啟后,在查詢時(shí)會(huì)自動(dòng)更新MaxCompute外部表元數(shù)據(jù)。該GUC建議僅在Session級(jí)別按需開啟,不要DB級(jí)別開啟,否則會(huì)產(chǎn)生大量表結(jié)構(gòu)變更檢查作業(yè),增大系統(tǒng)壓力。
set hg_experimental_enable_auto_load_check_schema_evolution = on;
說(shuō)明外部表自動(dòng)加載暫不支持OSS外部表的Schema Evolution。
外部表自動(dòng)加載支持通過DLF元數(shù)據(jù)自動(dòng)加載,來(lái)加速查詢存儲(chǔ)于OSS的數(shù)據(jù),詳情請(qǐng)參見OSS數(shù)據(jù)湖加速。
使用限制
使用外部表自動(dòng)加載時(shí),MaxCompute和OSS數(shù)據(jù)源映射參數(shù)不能以hg_或者holo_開頭,這些是Hologres的保留關(guān)鍵字。
每次查詢最多只能自動(dòng)加載6張表,即一個(gè)SQL中最多包含6張表。若超過6張表,自動(dòng)加載將失敗,需要重新查詢以便自動(dòng)加載外部表。
外部表自動(dòng)加載時(shí),如果MaxCompute表中包含Hologres外部表目前不支持的數(shù)據(jù)類型,那么該外部表將無(wú)法自動(dòng)創(chuàng)建,您需要使用
CREATE FOREIGN TABLE
手動(dòng)選擇支持的字段來(lái)創(chuàng)建外部表。如使用Auto Load自動(dòng)加載OSS數(shù)據(jù),需通過執(zhí)行
CREATE USER MAPPING
命令,為訪問賬號(hào)(包括阿里云賬號(hào))指定訪問DLF和OSS的Access Key、Access Secret。如您同時(shí)加載多個(gè)外部數(shù)據(jù)源的表到同一個(gè)Hologres Schema,后創(chuàng)建的外部表會(huì)覆蓋先創(chuàng)建的同名外部表,請(qǐng)將不同的數(shù)據(jù)源關(guān)聯(lián)到不同的Hologres Schema。
通過Auto Load自動(dòng)加載外部表時(shí),指定了在Hologres中不存在的Schema,系統(tǒng)可自動(dòng)創(chuàng)建該Schema,但要求用戶需具有db_admin權(quán)限。
外部表全量自動(dòng)加載場(chǎng)景下:
不建議設(shè)置自動(dòng)加載時(shí)間小于5分鐘。
不建議對(duì)表超過1000張的外部數(shù)據(jù)源開啟全量自動(dòng)加載。
操作步驟
開啟自動(dòng)加載
語(yǔ)法
-- 打開自動(dòng)加載 ALTER DATABASE <database name> SET hg_experimental_enable_auto_load_foreign_table = on;
參數(shù)說(shuō)明
database name:Hologres數(shù)據(jù)庫(kù)名稱。
(可選)設(shè)置自動(dòng)加載模式
從Hologres V2.2.1版本開始,您可以根據(jù)實(shí)際業(yè)務(wù)需求設(shè)置自動(dòng)加載模式,若您未設(shè)置自動(dòng)加載模式,則默認(rèn)采用外部表按需加載模式。Hologres V2.2.1以下版本無(wú)需設(shè)置。
語(yǔ)法
SET hg_experimental_load_foreign_table_mode = ['query' | 'period']
取值說(shuō)明如下:
query(默認(rèn)值):外部表按需加載。
-- 設(shè)置外部表加載模式為按需加載 SET hg_experimental_load_foreign_table_mode = 'query';
period:外部表全量加載。
-- 設(shè)置外部表加載模式為全量加載 SET hg_experimental_load_foreign_table_mode = 'period';
配置映射關(guān)系
語(yǔ)法
配置MaxCompute映射關(guān)系
Hologres V2.2.1及以上版本
--MaxCompute項(xiàng)目為三層模型 ALTER DATABASE <database> SET hg_experimental_auto_load_foreign_schema_mapping = '<hologres_schema>:<odps_foreign_server>.<mc_project>.<mc_schema>, [...]'; --MaxCompute項(xiàng)目為兩層模型 ALTER DATABASE <database> SET hg_experimental_auto_load_foreign_schema_mapping = '<hologres_schema>:<odps_foreign_server>.<mc_project>, [...]';
Hologres V2.2.1以下版本
ALTER DATABASE <database> SET hg_experimental_default_odps_project_list='<odps_project_name_1>,<odps_project_name_2>...';
配置DLF映射關(guān)系
--DLF Default Catalog ALTER DATABASE <database> SET hg_experimental_auto_load_foreign_schema_mapping = '<hologres_schema>:<dlf_foreign_server>.<dlf_database> [...]'; -- 自定義Catalog ALTER DATABASE <database> SET hg_experimental_auto_load_foreign_schema_mapping = '<hologres_schema>:<dlf_foreign_server>.<dlf_catalog>.<dlf_database>, [...]';
參數(shù)說(shuō)明
參數(shù)名稱
說(shuō)明
database
Hologres數(shù)據(jù)庫(kù)名稱。
hologres_schema
Hologres Schema名稱。
mc_project
需要自動(dòng)加載的MaxCompute項(xiàng)目名稱。您可以登錄MaxCompute控制臺(tái),在 頁(yè)面獲取MaxCompute項(xiàng)目名稱。
odps_foreign_server
訪問MaxCompute項(xiàng)目使用的server,固定為
odps_server
。odps_project_name
odps_project_name為MaxCompute的項(xiàng)目名稱,支持設(shè)置多個(gè)項(xiàng)目,中間使用逗號(hào)隔開即可。
默認(rèn)值為空,即不周期性地加載任何MaxCompute項(xiàng)目中表的元數(shù)據(jù)。
說(shuō)明僅Hologres V2.2.1以下版本需配置此參數(shù)。
mc_schema
MaxCompute的Schema名稱。
說(shuō)明僅已開啟三層模型的項(xiàng)目需配置此參數(shù),關(guān)于Schema詳情,請(qǐng)參見Schema操作。
dlf_foreign_server
基于DLF_FDW創(chuàng)建的外部服務(wù)器。您可以執(zhí)行以下命令,獲取外部服務(wù)器名稱。詳情請(qǐng)參見OSS數(shù)據(jù)湖加速。
SELECT * FROM pg_foreign_server;
dlf_catalog
需要自動(dòng)加載的DLF數(shù)據(jù)庫(kù)所在的數(shù)據(jù)目錄名。您可以登錄數(shù)據(jù)湖管理控制臺(tái),選擇 ,然后在數(shù)據(jù)目錄頁(yè)簽,獲取數(shù)據(jù)目錄名稱。
dlf_database
需要自動(dòng)加載的DLF數(shù)據(jù)庫(kù)名稱。您可以登錄數(shù)據(jù)湖管理控制臺(tái),選擇 ,然后在數(shù)據(jù)庫(kù)頁(yè)簽,獲取數(shù)據(jù)庫(kù)名稱。
查詢數(shù)據(jù)
您可直接查看相應(yīng)MaxCompute和DLF中的數(shù)據(jù)。
--查詢MaxCompute項(xiàng)目數(shù)據(jù)
SELECT * FROM <hologres_schema>.<mc_table>;
--查詢DLF數(shù)據(jù)
SELECT * FROM <hologres_schema>.<dlf_table>;
更多操作
關(guān)閉自動(dòng)加載
語(yǔ)法
---- 關(guān)閉自動(dòng)加載 ALTER DATABASE <database name> SET hg_experimental_enable_auto_load_foreign_table = off;
說(shuō)明關(guān)閉自動(dòng)加載后,系統(tǒng)將停止自動(dòng)同步外部數(shù)據(jù)源的元數(shù)據(jù)和創(chuàng)建新的外部表。您僅可在Hologres查看已經(jīng)加載的外部表和數(shù)據(jù)。如需增加更多外部表,需要手動(dòng)執(zhí)行import命令,詳情請(qǐng)參見 IMPORT FOREIGN SCHEMA。
參數(shù)說(shuō)明
database name:Hologres數(shù)據(jù)庫(kù)名稱。
查看已開啟自動(dòng)加載的數(shù)據(jù)源
-- 2.2版本以前,查看已設(shè)置的MaxCompute數(shù)據(jù)源
SHOW hg_experimental_default_odps_project_list;
-- 2.2版本以后,查看已設(shè)置的MaxCompute和DLF數(shù)據(jù)源
SHOW hg_experimental_auto_load_foreign_schema_mapping;
設(shè)置巡檢周期
在配置指定數(shù)據(jù)源進(jìn)行全量加載后,若數(shù)據(jù)源中新增了表,可以通過以下時(shí)間參數(shù)進(jìn)行周期性巡檢。當(dāng)超過設(shè)置的巡檢時(shí)間后,系統(tǒng)在查詢對(duì)應(yīng)外部表時(shí)會(huì)自動(dòng)加載新增的表為Hologres外部表,實(shí)現(xiàn)增量外部表加載。默認(rèn)間隔時(shí)間為30分鐘,即30分鐘內(nèi)有新增表,在30分鐘之后查詢發(fā)起時(shí),會(huì)自動(dòng)將新增的表加載為Hologres外部表。
語(yǔ)法
--設(shè)置指定Hologres數(shù)據(jù)庫(kù)的巡檢周期為600 s ALTER DATABASE <database name> SET hg_experimental_load_all_foreign_table_interval_time = 600;
參數(shù)說(shuō)明
database name:Hologres數(shù)據(jù)庫(kù)名稱。
建議巡檢周期不要小于600 s(即10分鐘)。
刪除已加載的外部表。
如果不再需要加速查詢外部表數(shù)據(jù),執(zhí)行DROP
語(yǔ)句刪除外部表即可,詳情請(qǐng)參見DROP FOREIGN TABLE。
使用示例
示例1:外部表按需加載
本文以MaxCompute數(shù)據(jù)源為例,分別演示兩層模型和三層模型項(xiàng)目數(shù)據(jù)自動(dòng)加載,示例詳情如下:
兩層模型:項(xiàng)目名稱為
mc_project
,表名稱為mc_table
。三層模型:項(xiàng)目名稱為
mc_3_layer_project
,Schema名稱為mc_schema
,表名稱為mc_table
。
兩層模型
開啟自動(dòng)加載。
ALTER DATABASE holo_demo SET hg_experimental_enable_auto_load_foreign_table = on;
配置映射關(guān)系。
---V2.2.1及以上版本 ALTER DATABASE holo_demo SET hg_experimental_auto_load_foreign_schema_mapping = 'hologres_schema:odps_server.mc_project'; ---V2.2.1以下版本 ALTER DATABASE holo_demo SET hg_experimental_default_odps_project_list='mc_project';
查詢外部表。
SELECT * FROM hologres_schema.mc_table;
三層模型
開啟自動(dòng)加載。
ALTER DATABASE holo_demo SET hg_experimental_enable_auto_load_foreign_table = on;
配置映射關(guān)系。
ALTER DATABASE holo_demo SET hg_experimental_auto_load_foreign_schema_mapping = 'holo_schema_3layer:odps_server.mc_3_layer_project.mc_schema';
查詢外部表。
SELECT * FROM holo_schema_3layer.mc_table;
示例2:外部表全量自動(dòng)加載
以DLF數(shù)據(jù)源為例,可以通過綁定DLF Default Catalog或自定義Catalog來(lái)自動(dòng)加載DLF外部表。
DLF Default Catalog
為DLF Default Catalog下
dlf_db
數(shù)據(jù)庫(kù)設(shè)置自動(dòng)加載,設(shè)置后會(huì)將該數(shù)據(jù)庫(kù)中的全部表自動(dòng)創(chuàng)建為Hologres外部表。同時(shí)系統(tǒng)會(huì)根據(jù)hg_experimental_load_all_foreign_table_interval_time
配置的周期性巡檢時(shí)間,自動(dòng)周期性加載這個(gè)數(shù)據(jù)庫(kù)中新增的表。創(chuàng)建外部服務(wù)
dlf_server
并配置Endpoint信息,詳情請(qǐng)參見OSS數(shù)據(jù)湖加速。--創(chuàng)建server CREATE SERVER IF NOT EXISTS dlf_server FOREIGN data wrapper dlf_fdw options ( dlf_endpoint 'dlf-share.cn-beijing.aliyuncs.com', oss_endpoint 'oss-cn-beijing-internal.aliyuncs.com' );
創(chuàng)建用戶映射。
Auto Load需要通過
CREATE USER MAPPING
命令指定訪問DLF和OSS的AccessKey ID和AccessKey Secret,詳情請(qǐng)參見OSS數(shù)據(jù)湖加速。CREATE USER MAPPING FOR <賬號(hào)uid> server <server_name> options ( dlf_access_id 'accessid', dlf_access_key 'accesskey', oss_access_id 'accessid', oss_access_key 'accesskey' );
開啟自動(dòng)加載。
ALTER DATABASE holo_demo SET hg_experimental_enable_auto_load_foreign_table = on;
設(shè)置映射關(guān)系及加載模式。
SET hg_experimental_auto_load_foreign_schema_mapping = 'holo_schema:dlf_server.dlf_db'; SET hg_experimental_load_foreign_table_mode = 'period'; SET hg_experimental_load_all_foreign_table_interval_time = 10;
查詢外部表數(shù)據(jù)。
SELECT * FROM holo_schema.dlf_table;
DLF自定義Catalog
創(chuàng)建外部Server并配置Endpoint信息,詳情請(qǐng)參見OSS數(shù)據(jù)湖加速。
CREATE SERVER IF NOT EXISTS DLF_server FOREIGN data wrapper dlf_fdw options ( dlf_endpoint 'dlf-share.cn-beijing.aliyuncs.com', oss_endpoint 'oss-cn-beijing-internal.aliyuncs.com' );
創(chuàng)建用戶映射。
Auto Load需要通過
CREATE USER MAPPING
命令指定訪問DLF和OSS的AccessKey ID和AccessKey Secret,詳情請(qǐng)參見OSS數(shù)據(jù)湖加速。CREATE USER mapping FOR <賬號(hào)uid> server <server_name> options ( dlf_access_id 'accessid', dlf_access_key 'accesskey', oss_access_id 'accessid', oss_access_key 'accesskey' );
開啟自動(dòng)加載。
ALTER DATABASE holo_demo SET hg_experimental_enable_auto_load_foreign_table = on;
配置映射關(guān)系、加載模式以及巡檢周期。
--配置映射關(guān)系 SET hg_experimental_auto_load_foreign_schema_mapping = 'holo_schema:DLF_server.dlf_catalog.dlf_db'; --加載模式為外部表全量加載 SET hg_experimental_load_foreign_table_mode = 'period'; --巡檢周期為600 s SET hg_experimental_load_all_foreign_table_interval_time = 600;
查詢外部表數(shù)據(jù)。
SELECT * FROM holo_schema.dlf_table;