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(Java SDK)。 
- (可选)如果您需要使用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数据源
语法使用
DLF语法
- DLF当前仅支持托管存储模式,Hologres通过 - CREATE EXTERNAL DATABASE建立元数据映射时仅需指定DLF相关参数即可。
- DLF当前仅支持创建Paimon catalog,Hologres在建立元数据映射时需指定metastore_type为 - dlf-paimon。
- 基于DLF托管存储模式,Hologres支持使用SLR和RAMRole两种用户认证方式,默认使用SLR身份透传方式,需要您提前完成服务关联角色(AliyunServiceRoleForHologresIdentityMgmt)授权,详见Hologres服务关联角色。如您需要使用RAMRole的方式来定义权限策略,请使用 - CREATE USER MAPPING,详见CREATE USER MAPPING。
更多DLF相关介绍,详情请参见DLF。
CREATE EXTERNAL DATABASE <ext_database_name> WITH
  catalog_type 'paimon'
  metastore_type 'dlf-rest'
  dlf_catalog '<dlf_catalog_name>' 
  [comment 'xxx']; DLF1.0语法
- DLF1.0支持用户自己的OSS存储及更多的湖格式,包括Paimon、Hudi、DeltaLake、ORC、Parquet、CSV等,支持详情参见数据湖加速。 
- 基于DLF1.0创建External Database需要用户指定metastore_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 | 是 | 指定外部数据源的元数据存储类型。 
 | 
| catalog_type | 是 | 指定需要映射的外部数据源的湖表类型。 
 说明  DLF1.0无需指定catalog_type。 | 
| dlf_region | 是 | 指定DLF服务所在地域,格式为<nation>-<region>,如 cn-beijing,DLF支持的地域详情请参见 | 
| dlf_endpoint | 是 | 指定访问DLF的MaxCompute&Hologres内部使用Endpoint,格式为dlf-share.<nation>-<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数据源
DLF
-- 创建External Database。
CREATE EXTERNAL DATABASE ext_database_dlf WITH
  metastore_type 'dlf-rest'
  catalog_type 'paimon'
  dlf_catalog 'dlf_paimon_catalog' 
  comment 'DLF paimon catalog'; 
-- 查询数据。
SELECT * FROM ext_database_dlf.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;