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