本文將為您介紹在Hologres中如何通過共享集群讀OSS數據。
背景信息
共享集群(OSS數據湖加速)是針對OSS數據湖設計的Serverless的在線查詢加速服務,基于Hologres存儲計算分離的云原生架構,以共享集群資源的形式,加速分析存儲在OSS中的湖數據,按需使用,按掃描量付費。對外提供兼容PostgreSQL的查詢接口,無需數據移動,無需集群運維,給湖數據分析提供穩定、快速、低成本的查詢服務,滿足湖倉融合、按需使用、實時分析的訴求。
功能介紹
OSS數據湖加速(共享集群)的實例在資源上是共享的,默認開啟湖加速能力,您購買實例后,請直接創建DLF Extension,導入外部表,即可開始查詢豐富的湖數據,具體支持的功能如下:
Hologres從 V1.1版本開始支持從OSS讀取ORC、Parquet、CSV、SequenceFile格式文件;從V1.3版本開始支持從OSS讀取HUDI、Delta格式文件,支持寫入ORC、Parquet、CSV、SequenceFile格式文件至OSS。請前往Hologres管控臺實例詳情頁查看當前實例版本,如果您的實例是V1.3以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
Hologres從 V1.3.25 版本開始支持使用DLF數據目錄(Multi-Catalog)做元數據隔離,方便您在測試環境、開發環境、跨部門集群之間做元數據隔離,以保障業務安全。DLF數據目錄詳情請參見數據目錄。
Hologres從V1.3.26版本開始支持讀寫存儲于OSS-HDFS上的數據。進一步擴展了數據湖加速的服務能力和邊界,使Hologres可以與Hadoop生態計算引擎無縫集成,加速讀寫存儲于HDFS上的數據,大幅提升Hadoop生態數據實時分析的效率,更好地滿足大數據和AI等領域的數據湖聯邦、實時分析訴求。
Hologres從V2.1.6版本開始支持讀取Apache Paimon湖格式。Apache Paimon是一種流批統一的湖存儲格式,支持高吞吐的寫入和低延遲的查詢,詳情請參見Apache Paimon。
前提條件
您已開通DLF數據湖構建,詳情請參見快速入門。共享集群支持的地域有:華北2(北京)、華東2(上海)、華東1(杭州)、華南1(深圳)和新加坡。
(可選)如果您需要使用DLF自定義數據目錄功能,請先在DLF中新建數據目錄,詳情請參見新建數據目錄。
您已開通OSS并準備好數據。
您已進行OSS授權操作,通過外部表方式訪問OSS數據,需要訪問的賬號有OSS的相關訪問權限,否則即使創建外表成功了,也無法查詢數據,OSS授權請參見Bucket Policy。
(可選)如果您需要使用OSS-HDFS功能,請開通OSS-HDFS服務,詳情請參見開通OSS-HDFS服務。
注意事項
共享集群僅支持使用DLF_FDW外表讀取OSS數據,不支持寫入數據。
不支持讀寫使用了OSS加速器的數據湖數據,OSS加速器詳情請參見使用OSS加速器。
IMPORT FOREIGN SCHEMA
語句支持導入存儲于OSS上的分區表,當前Hologres支持查詢最多分區數為512個,請添加分區過濾條件,使查詢時一次查詢不超過512個分區。湖數據查詢的原理是在運行時將外部表數據的特定查詢分區加載到Hologres的內存和緩存中完成計算,為不影響查詢體驗,Hologres一次查詢支持的數據量不能超過200 GB(經分區過濾后命中的數據量)。
數據類型映射
Hologres與數據湖數據類型映射關系請參見數據類型匯總。
使用說明
配置環境
創建Extension。
說明從V2.1.6版本開始,Hologres在創建實例的時候默認創建
dlf_fdw
,您無需再手動創建。V2.1.5及以下版本需要手動創建。在Hologres中由Superuser在DB中執行以下語句創建Extension,用于開啟通過DLF讀取OSS數據的功能。該操作針對整個DB生效,一個DB只需執行一次。
CREATE EXTENSION IF NOT EXISTS dlf_fdw;
創建外部服務器(Server)。
Hologres支持DLF數據目錄(Multi-Catalog)功能,如果您只有一個EMR集群,請使用DLF默認數據目錄即可;如果您有多個EMR集群,可以使用自定義數據目錄來控制Hologres實例連接到不同的EMR集群。同時,您也可以選擇原生OSS或者OSS-HDFS作為數據來源,具體配置如下:
使用DLF默認數據目錄。
創建Server用于Hologres連接DLF和OSS使用DLF默認數據目錄和原生OSS存儲創建Server,示例語法如下。
--查看現有server SELECT * FROM pg_foreign_server; --刪除現有 server DROP server server_name cascade; --創建 server CREATE SERVER IF NOT EXISTS < servername > FOREIGN data wrapper dlf_fdw options ( dlf_region 'cn-<region>', dlf_endpoint 'dlf-share.cn-<region>.aliyuncs.com', oss_endpoint 'oss-cn-<region>-internal.aliyuncs.com' );
使用DLF自定義數據目錄。
創建Server默認連接到DLF的默認數據目錄,如您需要訪問自定義數據目錄,需要在創建Server時指定DLF數據目錄參數,示例語法如下。
--刪除現有server DROP server server_name cascade; --創建server CREATE SERVER IF NOT EXISTS < servername > FOREIGN data wrapper dlf_fdw options ( dlf_region 'cn-<region>', dlf_endpoint 'dlf-share.cn-<region>.aliyuncs.com', oss_endpoint 'oss-cn-<region>-internal.aliyuncs.com', [dlf_catalog 'dlf_catalog_name'] -- 添加自定義Catalog參數 );
使用OSS-HDFS作為數據湖存儲。
確定OSS-HDFS Bucket域名。
通過DLF_FDW訪問存儲在OSS-HDFS上數據,需要配置OSS-HDFS的服務域名,域名地址可以在OSS控制臺中,已開通OSS-HDFS服務的Bucket概覽頁獲取,詳情請參見獲取OSS-HDFS服務域名。
創建Foreign Server并配置Endpoint信息。
確定OSS-HDFS Bucket域名后即可在Hologres中配置DLF_FDW oss_endpoint選項,示例語法如下。
CREATE EXTENSION IF NOT EXISTS dlf_fdw; CREATE SERVER IF NOT EXISTS < servername > FOREIGN data wrapper dlf_fdw options ( dlf_region 'cn-<region>', dlf_endpoint 'dlf-share.cn-<region>.aliyuncs.com', oss_endpoint 'oss-cn-<region>.oss-dls.aliyuncs.com' -- OSS-HDFS Bucket 域名 );
參數說明。
參數
說明
示例
server_name
自定義的server名稱。
oss_server
dlf_region
連接DLF所在的地域,請您根據地域進行選擇,可選項如下。
華北2(北京):
cn-beijing
。華東1(杭州):
cn-hangzhou
。華東2(上海):
cn-shanghai
。華南1(深圳):cn-shenzhen。
新加坡:
ap-southeast-1
。
cn-hangzhou
dlf_endpoint
推薦使用DLF的對內服務Endpoint,可以獲得更好的訪問性能,如您需要跨Region 訪問DLF元數據及OSS數據,則需使用公網Endpoint,詳情請參見已開通的地域和訪問域名。請您根據地域進行選擇,可選項如下。
華北2(北京):
dlf-share.cn-beijing.aliyuncs.com
。華東1(杭州):
dlf-share.cn-hangzhou.aliyuncs.com
。華東2(上海):
dlf-share.cn-shanghai.aliyuncs.com
。華南1(深圳):dlf-share.cn-shenzhen.aliyuncs.com。
新加坡:
dlf-share.ap-southeast-1.aliyuncs.com
。
dlf-share.cn-shanghai.aliyuncs.com
oss_endpoint
原生OSS存儲推薦使用OSS的內網Endpoint,以獲得更好的訪問性能,如您需要同Hologres、DLF跨Region交互,請需使用公網Endpoint,詳情請參見OSS訪問域名使用規則。
OSS-HDFS Bucket域名。
OSS-HDFS目前僅支持內網訪問,即默認不支持跨區域訪問。,域名獲取方式詳情請參見獲取OSS-HDFS服務域名
。
oss-cn-shanghai-internal.aliyuncs.com
cn-hangzhou.oss-dls.aliyuncs.com
dlf_catalog
在DLF中新建的數據目錄,詳情請參見新建數據目錄。
dlf_catalog
(可選)創建用戶映射。
Hologres支持通過CREATE USER MAPPING命令指定其他用戶身份來訪問DLF和OSS,如:foreign server的Owner可以通過CREATE USER MAPPING指定RAM用戶123xxx來訪問OSS外部數據。
查詢時請確保該賬號有對應外部數據的查詢權限。詳細原理請參見postgres create user mapping。
CREATE USER MAPPING FOR < 賬號uid > SERVER hm_dlf_server options ( dlf_access_id '<accesskey id>', dlf_access_key 'accesskey', oss_access_id 'accessid', oss_access_key 'accesskey' );
當前阿里云賬號的AccessKey ID和AccessKey Secret,獲取方式請參見創建訪問密鑰。
使用示例:
--為當前用戶創建用戶映射 CREATE USER MAPPING FOR CURRENT_USER SERVER hm_dlf_server options ( dlf_access_id 'LTAI5txxx', dlf_access_key 'y8LUUyyy', oss_access_id 'LTAI5txxx', oss_access_key 'y8LUUyyy' ); --為RAM用戶123xxx創建用戶映射 CREATE USER MAPPING FOR "p4_123xxx" SERVER hm_dlf_server options ( dlf_access_id 'LIlY5txxx', dlf_access_key 'KsjkXKyyy', oss_access_id 'LIlY5txxx', oss_access_key 'KsjkXKyyy' ); --刪除用戶映射 DROP USER MAPPING FOR CURRENT_USER SERVER hm_dlf_server options; DROP USER MAPPING FOR "p4_123xxx" SERVER hm_dlf_server options;
讀取OSS湖數據
以DLF數據源為例,您需要在DLF中準備元數據表,并保證該表中已抽取數據,詳情請參見元數據管理。在Hologres中以外部表方式通過DLF訪問OSS的數據操作步驟如下:
在Hologres實例中創建外部表。
Server創建完成后,您可以在Hologres中使用CREATE FOREIGN TABLE創建外部表或使用IMPORT FOREIGN SCHEMA語法單獨或者批量創建外部表,用于讀取DLF抽取的OSS數據。
說明如果存在OSS外部表和Hologres內部表同名的表,
IMPORT FOREIGN SCHEMA
語法會跳過該外部表的創建,請使用CREATE FOREIGN TABLE
語法創建一個非重名表。Hologres支持讀取OSS中的分區表,支持作為分區鍵的數據類型有:TEXT、VARCHAR和INT。CREATE FOREIGN TABLE方式因只做字段映射,不實際存儲數據,將分區字段作為普通字段來創建即可;IMPORT FOREIGN SCHEMA方式無需關心表字段,會自動處理表字段映射。
語法示例
-- 方式一: CREATE FOREIGN TABLE [ IF NOT EXISTS ] ext_table_name ( [ { column_name data_type } [, ... ] ] ) SERVER dlf_server options ( schema_name '<dlf_database_name>', table_name '<dlf_table_name>' ); -- 方式二: IMPORT FOREIGN SCHEMA schema_name [ { limit to | except } ( table_name [, ...] ) ] from server server_name into local_schema [ options ( option 'value' [, ... ] ) ]
參數說明
參數
說明
schema_name
DLF中創建的元數據庫名。
table_name
DLF中創建的元數據表名。
server_name
Hologres中創建的Server名。
local_schema
Hologres中的Schema名。
options
IMPORT FOREIGN SCHEMA中的option參數取值,詳情請參見IMPORT FOREIGN SCHEMA。
使用示例。
單獨創建。
創建一張外部表映射DLF元數據庫dlfpro中元數據表dlf_oss_test的數據,該表位于Hologres中的public Schema,并且檢驗是否存在該外部表,若存在,則對已有表更新。
-- 方式一 CREATE FOREIGN TABLE dlf_oss_test_ext ( id text, pt text ) SERVER dlf_server options ( schema_name 'dlfpro', table_name 'dlf_oss_test' ); -- 方式二: IMPORT FOREIGN SCHEMA dlfpro LIMIT TO ( dlf_oss_test ) FROM SERVER dlf_server INTO public options (if_table_exist 'update');
批量創建。
將DLF元數據庫dlfpro中所有的表都映射至Hologres的public Schema,將會在Hologres中批量創建同名外部表。
整庫導入。
IMPORT FOREIGN SCHEMA dlfpro FROM SERVER dlf_server INTO public options (if_table_exist 'update');
多表導入。
IMPORT FOREIGN SCHEMA dlfpro ( table1, table2, tablen ) FROM SERVER dlf_server INTO public options (if_table_exist 'update');
數據查詢。
創建外部表成功后,在HoloWeb可以看到該外部表,可以直接查詢外部表讀取OSS中的數據。
非分區表
SELECT * FROM dlf_oss_test;
分區表
SELECT * FROM partition_table where dt = '2013';
相關文檔
如果您想了解基于Paimon湖存儲格式的Hologres實踐方案,請參見基于Paimon的Hologres Serverless數據湖解決方案。