Hologres从V3.0版本开始支持外部数据库(External Database)功能。本文为您介绍什么是外部数据库,以及如何使用外部数据库来管理外部数据源中的表,并实现内外表的联邦查询。
背景信息
CREATE EXTERNAL DATABASE
用于在Hologres实例中创建一个外部数据库,来加载外部数据源的元数据到Hologres,方便在一个系统中同时管理内、外部数据,实现湖仓一体架构下统一的元数据管理。
内部数据是指存储于Hologres标准存储和低频访问存储中的数据,外部数据当前支持存储于MaxCompute和DLF数据湖上的数据,Hologres与MaxCompute无缝互通,通过直读直写MaxCompute存储实现仓内数据高速交换,通过阿里云数据湖构建(Data Lake Formation,以下简称DLF)来管理OSS数据湖数据,使用自研HQE引擎来实现Paimon、Hudi、DeltaLake等湖上数据的高性能读写。
External Database是全局可见的,即在Hologres中登录任意Database均可以通过引用ext_db.ext_schema.ext_table
的方式实现外部数据源的读写,同时也支持直接连接到外部数据库,在该库中执行各种SQL及设置GUC。
EXTERNAL DATABASE的权限全部由外部系统(如MaxCompute、DLF)来控制,Hologres仅做身份透传。用户访问External Database,默认使用服务关联角色(以下简称SLR)进行身份透传,您需要在访问外部数据源之前使用主账号或者有权限的子账号完成SLR授权,详情请参见Hologres服务关联角色。同时Hologres支持使用RAMRole的方式访问外部数据源,方便您自定义外部访问策略,详情请参见RAM角色概览;对于非阿里云账号和RAM账号,如Hologres BASIC账号,Hologres提供CREATE USER MAPPING
来实现账号绑定和授权,详情请参见CREATE USER MAPPING。
前提条件
Hologres管控台实例列表或实例详情页开启数据湖加速,操作方式为点击目标实例操作列的数据湖加速并在弹窗中点击确认。
您已开通DLF数据湖构建,详情请参见快速入门。支持开通DLF的地域请参见已开通的地域和访问域名。
如您使用DLF1.0,则需要额外开通OSS并完成OSS授权操作。通过外部表方式访问OSS数据,需要访问的账号有OSS的相关访问权限,否则即使创建外表成功了,也无法查询数据,OSS授权请参见Bucket Policy。
(可选)如果您需要使用OSS-HDFS功能,请开通OSS-HDFS服务,详情请参见开通OSS-HDFS服务。
使用限制
执行该命令的账号需要具备Superuser权限。
登录内部数据库后,可通过指定完整路径
ext_db.ext_schema.ext_table
的方式来访问外部DB中的表,但连接外部数据库后,不支持在外部数据库中访问内部数据库中的表。当通过External Database与外部数据源建立映射后,为提升访问效率,Hologres侧默认会有5分钟的元数据缓存,当前暂不支持自定义缓存过期时间。
当外部数据源为MaxCompute时,仅支持MaxCompute内部Project,不支持外部Project。
语法说明
MaxCompute数据源
语法使用
CREATE EXTERNAL DATABASE <ext_database_name> WITH
metastore_type 'maxcompute'
mc_project 'project_name'
[comment 'xxx'];
参数说明
参数名称 | 功能说明 | 是否必填 | 默认值 |
metastore_type | 指定外部数据源的元数据存储类型,MaxCompute数据源固定为 | 是 | 无 |
mc_project | 指定需要映射的MaxCompute Project名称,仅支持MaxCompute内部Project。 | 是 | 无 |
comment | 数据库描述信息。 | 否 | 无 |
DLF数据源
语法使用
DLF2.0语法
DLF2.0当前仅支持托管存储模式,Hologres通过
CREATE EXTERNAL DATABASE
建立元数据映射时仅需指定DLF相关参数即可。DLF2.0当前仅支持创建Paimon catalog,Hologres在建立元数据映射时需指定metastore_type为
dlf-paimon
。基于DLF2.0托管存储模式,Hologres支持使用SLR和RAMRole两种用户认证方式,默认使用SLR身份透传方式,需要您提前完成服务关联角色(AliyunServiceRoleForHologresIdentityMgmt)授权,详见Hologres服务关联角色。如您需要使用RAMRole的方式来定义权限策略,请使用
CREATE USER MAPPING
,详见CREATE USER MAPPING。
更多DLF2.0相关介绍,详情请参见DLF 2.0。
CREATE EXTERNAL DATABASE <ext_database_name> WITH
metastore_type ' dlf-paimon'
catalog_type 'paimon'
dlf_region ' '
dlf_endpoint ' '
dlf_catalog ' '
[comment 'xxx'];
DLF1.0语法
DLF1.0支持用户自己的OSS存储及更多的湖格式,包括Paimon、Hudi、DeltaLake、ORC、Parquet、CSV等,支持详情参见实时数据湖概述。
基于DLF1.0创建External Database需要用户指定catalog_type为dlf,同时提供DLF和OSS的Endpoint以及AKSK认证信息。
DLF1.0不支持使用SLR和RAMRole方式进行用户认证。
CREATE EXTERNAL DATABASE <ext_database_name> WITH
metastore_type 'dlf'
dlf_region ' '
dlf_endpoint ' '
dlf_catalog ' '
oss_endpoint ''
[comment 'xxx'];
参数说明
参数名称 | 功能说明 | 是否必填 | 默认值 |
metastore_type | 指定外部数据源的元数据存储类型,对于DLF1.0数据源,固定为“dlf”,对于DLF2.0,格式为“dlf-xxx”,当前仅支持“dlf-paimon”类型。 | 是 | 无 |
catalog_type | 指定需要映射的外部数据源的湖表类型,对于DLF1.0,支持paimon、hudi、deltalake orc、parquet、csv 、sequencefile等格式;对于DLF2.0,当前仅支持paimon表格式。 | 是 | 无 |
dlf_region | 指定DLF服务所在地域,格式为<nation>-<region>,如 cn-beijing,DLF支持的地域详情请参见 | 是 | 无 |
dlf_endpoint | 指定访问DLF的MaxCompute&Hologres内部使用Endpoint,格式为dlf-share.<nationg>-<region>.aliyuncs.com,详情请参见已开通的地域和访问域名。 | 是 | 无 |
dlf_catalog | 指定DLF数据源所属的数据目录。 | 是 | 无 |
dlf_access_id | 指定用户访问dlf使用的阿里云账号的 Access Key Id。 | 是 | 无 |
dlf_access_key | 指定用户访问dlf使用的阿里云账号的 Access Key Secret。 | 是 | 无 |
oss_endpoint | 指定访问OSS的Endpoint 信息:
| 是 | 无 |
oss_access_id | 指定用户访问OSS使用的阿里云账号的 Access Key Id。 | 是 | 无 |
oss_access_key | 指定用户访问OSS使用的阿里云账号的 Access Key Secret。 | 是 | 无 |
COMMENT | 数据库描述信息。 | 否 | 无 |
相关操作
查看实例中的所有外部DB
SELECT database_name, options FROM hologres.hg_external_databases();
刷新外部元数据
REFRESH CACHE FOR EXTERNAL DATABASE <EXT_DB_NAME> WITH( cache_level = 'metadata');
使用示例
MaxCompute数据源
MaxCompute 两层模型项目在Hologres创建External Database后,默认展示为三层结构,即ext_db.ext_schema.mc_table
,查询表时同样需要写成三层的语法,Schema Name默认是default
,即SELECT xxx FROM ext_db.default.mc_table
。
-- 创建External Database。
CREATE EXTERNAL DATABASE ext_database_mc WITH
metastore_type 'maxcompute'
mc_project 'mc_3_layer_project'
comment 'mc three layer project';
-- 查询数据。
SELECT * FROM ext_database_mc.mc_schema.mc_table;
DLF数据源
DLF2.0
-- 创建External Database。
CREATE EXTERNAL DATABASE ext_database_dlf2 WITH
metastore_type 'dlf-paimon'
catalog_type 'paimon'
dlf_region 'cn-beijing'
dlf_endpoint 'dlfnext-share.cn-beijing.aliyuncs.com'
dlf_catalog 'clg-paimon-xxxxxxxxxxx'
comment 'DLF2.0 paimon catalog';
-- 查询数据。
SELECT * FROM ext_database_dlf2.dlf_db.paimon_table;
DLF1.0
-- 创建External Database。
CREATE EXTERNAL DATABASE ext_database_dlf1 WITH
metastore_type 'dlf'
dlf_region 'cn-beijing'
dlf_endpoint 'dlf-share.cn-beijing.aliyuncs.com'
dlf_catalog 'hive_catalog'
oss_endpoint 'oss-cn-beijing-internal.aliyuncs.com'
comment 'DLF1.0 hive catalog';
-- 为当前用户创建User Mapping
CREATE USER MAPPING FOR current_user
EXTERNAL DATABASE ext_database_dlf1
OPTIONS
(
-- For DLF1.0
dlf_access_id 'LTxxxxxxxxxx',
dlf_access_key 'y8xxxxxxxxxxxxx',
oss_access_id 'LTxxxxxxxxxx',
oss_access_key 'y8xxxxxxxxxxxxx'
);
-- 查询数据。
SELECT * FROM ext_database_dlf1.dlf_db.hive_table;