基于阿里云數據湖構建(Data Lake Formation,DLF)和對象存儲(Object Storage Service,OSS)推出的Hologres數據湖加速服務,提供了靈活的數據訪問和分析能力以及高效的數據處理能力,顯著加快了對OSS數據湖的查詢和分析過程。本文將為您介紹在Hologres中如何通過DLF讀寫OSS數據。
前提條件
您已開通DLF數據湖構建,詳情請參見快速入門。支持開通DLF的地域請參見已開通的地域和訪問域名。
(可選)如果您需要使用DLF自定義數據目錄功能,請先在DLF中新建數據目錄,詳情請參見新建數據目錄。
您已開通OSS并準備好數據,詳情請參見開通OSS服務。
您已進行OSS授權操作,通過外部表方式訪問OSS數據,需要訪問的賬號有OSS的相關訪問權限,否則即使創建外表成功了,也無法查詢數據,OSS授權請參見Bucket Policy。
(可選)如果您需要使用OSS-HDFS功能,請開通OSS-HDFS服務,詳情請參見開通OSS-HDFS服務。
注意事項
Hologres數據導出至OSS時僅支持執行
INSERT INTO
命令,不支持執行INSERT ON CONFLICT
、UPDATE
和DELETE
命令。僅Hologres V1.3及以上版本支持回寫數據至OSS,且僅支持ORC、Parquet、CSV、SequenceFile格式文件。
Hologres暫不支持從引擎側自動創建OSS外部表,如需使用
INSERT INTO
命令回寫數據至OSS,請在DLF中提前創建好對應的外部表,如需導出數據至分區表,請提前創建好對應的分區。只讀從實例暫不支持開啟數據湖加速能力。
不支持讀寫使用了OSS加速器的數據湖數據,OSS加速器詳情請參見使用OSS加速器。
IMPORT FOREIGN SCHEMA
語句支持導入存儲于OSS上的分區表,當前Hologres最多支持查詢512個分區,請添加分區過濾條件,使得一次查詢不超過512個分區。湖數據查詢的原理是在運行時將外表數據的特定查詢分區加載到Hologres的內存和緩存中完成計算,為不影響查詢體驗,Hologres一次查詢支持的數據量不超過200GB(經分區過濾后命中的數據量)。
不支持對外表執行
UPDATE
、DELETE
及TRUNCATE
等命令。
使用說明
環境配置
在Hologres實例中開啟DLF_FDW后臺配置。
前往Hologres管控臺實例列表或實例詳情頁,單擊目標實例操作列的數據湖加速并確認,后臺將自動配置DLF_FDW并重啟實例,重啟完成即可使用該服務。
說明Hologres控制臺自助開啟DLF_FDW后臺配置功能陸續開放中,如果您暫時看不到數據湖加速按鈕,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
開啟DLF_FDW后默認使用當前系統資源(目前規格是1Core 4GB),無需額外購買資源。
創建Extension。
在Hologres中由Superuser在DB中執行以下語句創建Extension,用于開啟通過DLF讀取OSS數據的功能。該操作針對整個DB生效,一個DB只需執行一次。
CREATE EXTENSION IF NOT EXISTS dlf_fdw;
創建外部服務器。
Hologres支持DLF數據目錄(Multi-Catalog)功能,如果您只有一個EMR集群,則使用DLF默認數據目錄(DLF Default Catalog)即可,如果您有多個EMR集群,可以使用自定義數據目錄來控制Hologres實例鏈接到不同的EMR集群。同時,您也可以選擇原生OSS或者OSS-HDFS作為數據來源,具體配置如下。
使用DLF默認數據目錄和原生OSS存儲創建Server,示例語法如下。
--查看現有server(其中meta_warehouse_server,odps_server是系統內置server,不可以修改和刪除) SELECT * FROM pg_foreign_server; --刪除現有server DROP SERVER <server_name> CASCADE; --創建server CREATE SERVER IF NOT EXISTS <server_name> FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( dlf_region '<region id>', dlf_endpoint 'dlf-share.<region id>.aliyuncs.com', oss_endpoint 'oss-<region id>-internal.aliyuncs.com' );
使用DLF自定義數據目錄。
創建Server默認連接到DLF的默認數據目錄,如您需要訪問自定義數據目錄,需要在創建Server時指定DLF數據目錄參數,示例語法如下。
--刪除現有 server DROP SERVER <server_name> CASCADE; --創建 server CREATE SERVER IF NOT EXISTS <server_name> FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( dlf_region '<region id>', dlf_endpoint 'dlf-share.<region id>.aliyuncs.com', oss_endpoint 'oss-<region id>-internal.aliyuncs.com', [dlf_catalog 'dlf_catalog_name'] -- 添加自定義Catalog參數 );
重要如果您使用DLF默認數據目錄,請勿定義
dlf_catalog
參數,僅自定義數據目錄支持使用dlf_catalog
參數進行聲明。使用DLF默認數據目錄請參見使用DLF默認數據目錄和原生OSS存儲創建Server。使用OSS-HDFS作為數據湖存儲。
確定OSS-HDFS Endpoint(地域節點)
通過DLF_FDW訪問存儲在OSS-HDFS上數據,需要配置OSS-HDFS的服務域名;域名地址可以在OSS控制臺中,已開通OSS-HDFS服務的Bucket概覽頁獲取。
創建外部Server并配置Endpoint信息
確認Bucket域名后即可在Hologres中配置DLF_FDW OSS_Endpoint選項,示例語法如下。
CREATE EXTENSION IF NOT EXISTS dlf_fdw; CREATE SERVER IF NOT EXISTS <server_name> FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( dlf_region '<region id>', dlf_endpoint 'dlf-share.<region id>.aliyuncs.com', oss_endpoint '<bucket_name>.<region id>.oss-dls.aliyuncs.com' -- OSS-HDFS Bucket Endpoint 域名節點 );
參數說明。
參數
說明
示例
server_name
自定義的server名稱。
dlf_server
dlf_region
連接DLF所在的地域,請您根據地域進行選擇。
華北2(北京):
cn-beijing
。華東1(杭州):
cn-hangzhou
。華東2(上海):
cn-shangha
i。華南1(深圳):
cn-shenzhen
。華北3(張家口):
cn-zhangjiakou
。新加坡:
ap-southeast-1
。德國(法蘭克福):
eu-central-1
。美國(弗吉尼亞):
us-east-1
。印度尼西亞(雅加達):
ap-southeast-5
。
cn-hangzhou
dlf_endpoint
推薦使用DLF的對內服務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
。華北3(張家口):
dlf-share.cn-zhangjiakou.aliyuncs.com
。新加坡:
dlf-share.ap-southeast-1.aliyuncs.com
。德國(法蘭克福):
dlf-share.eu-central-1.aliyuncs.com
。美國(弗吉尼亞):
dlf-share.us-east-1.aliyuncs.com
。印度尼西亞(雅加達):
dlf-share.ap-southeast-5.aliyuncs.com
。
dlf-share.cn-shanghai.aliyuncs.com
oss_endpoint
原生OSS存儲推薦使用OSS的內網Endpoint,以獲得更好的訪問性能。
OSS-HDFS目前僅支持內網訪問,域名獲取方式詳見獲取OSS-HDFS服務域名。
OSS
oss-cn-shanghai-internal.aliyuncs.com
OSS-HDFS
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 <server_name> OPTIONS ( dlf_access_id 'accessid', dlf_access_key 'accesskey', oss_access_id 'accessid', oss_access_key 'accesskey' );
使用示例:
--為當前用戶創建用戶映射 CREATE USER MAPPING FOR current_user SERVER <server_name> 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 <server_name> OPTIONS ( dlf_access_id 'LIlY5txxx', dlf_access_key 'KsjkXKyyy', oss_access_id 'LIlY5txxx', oss_access_key 'KsjkXKyyy' ); --刪除用戶映射 DROP USER MAPPING FOR current_user SERVER <server_name>; DROP USER MAPPING FOR "p4_123xxx" SERVER <server_name>;
讀取OSS湖數據
以DLF數據源為例,您需要在DLF中準備元數據表,并保證該表中已抽取數據,詳情請參見元數據管理。在Hologres中以外部表方式通過DLF訪問OSS的數據操作步驟如下:
在Hologres實例中創建外部表。
Server創建完成后,您可以在Hologres中使用CREATE FOREIGN TABLE創建外部表或IMPORT FOREIGN SCHEMA語法單獨或者批量創建外部表,用于讀取DLF抽取的OSS數據。
說明如果OSS外部表存在和Holo內表同名的表,IMPORT FOREIGN SCHEMA會跳過該外部表的創建,請使用CREATE FOREIGN TABLE來定義一個非重復表名來創建。
Hologres支持讀取OSS中的分區表,支持作為分區鍵的數據類型為TEXT、VARCHAR和INT。CREATE FOREIGN TABLE方式因只做字段映射,不實際存儲數據,將分區字段作為普通字段來創建即可;IMPORT FOREIGN SCHEMA方式無需關心表字段,會自動處理表字段映射。
語法示例
-- 方式一 CREATE FOREIGN TABLE [ IF NOT EXISTS ] oss_table_name ( [ { column_name data_type } [, ... ] ] ) SERVER <server_name> 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 <server_name> OPTIONS ( schema_name 'dlfpro', table_name 'dlf_oss_test' ); -- 方式二 IMPORT FOREIGN SCHEMA dlfpro LIMIT TO ( dlf_oss_test ) FROM SERVER <server_name> INTO public options (if_table_exist 'update');
批量創建。
將DLF元數據庫dlfpro中所有的表都映射至Hologres的public Schema,將會在Hologres中批量創建同名外部表。
整庫導入。
IMPORT FOREIGN SCHEMA dlfpro FROM SERVER <server_name> INTO public options (if_table_exist 'update');
多表導入。
IMPORT FOREIGN SCHEMA dlfpro ( table1, table2, tablen ) FROM SERVER <server_name> INTO public options (if_table_exist 'update');
數據查詢。
創建外部表成功后,可以直接查詢外部表讀取OSS中的數據。
非分區表
SELECT * FROM dlf_oss_test;
分區表
SELECT * FROM partition_table where dt = '2013';
下一步
若您需要將OSS數據導入Hologres內部表直接查詢,以獲得更好的性能體驗,請參見使用SQL從數據湖導入。
若您要將Hologres內部表數據回寫至OSS數據湖,并使用外部引擎查詢,請參見導出至數據湖。
常見問題
創建DLF外部表時,提示報錯ERROR: babysitter not ready,req:name:"HiveAccess"
。
問題原因。
未添加后臺配置。
解決方法。
請您在管理控制臺的實例列表頁單擊數據湖加速以開啟后臺配置。