CREATE EXTERNAL DATABASE

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数据源固定为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存储推荐使用OSS的内网Endpoint,以获得更好的访问性能。

  • OSS-HDFS目前仅支持内网访问,域名获取方式详见获取OSS-HDFS服务域名

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;