External Catalog
External Catalog 提供以零 ETL 方式直接访问外部数据源的联邦查询能力,无需数据导入或搬迁。您可以接入 Apache Hive、Apache Iceberg、Delta Lake、Apache Paimon 等数据湖,以及 MySQL 协议兼容的数据库(RDS MySQL、StarRocks、AnalyticDB for MySQL 另一实例),实现跨源透明查询、湖仓融合分析与数据导入加工。
支持的 Catalog 类型
|
类型 |
数据源 |
集群版本要求 |
元数据服务 |
支持的操作 |
|
Paimon Catalog |
Apache Paimon |
3.2.7 |
|
查询、写入、DDL(3.2.8 起) |
|
Hive Catalog |
Apache Hive |
3.2.8 |
HMS |
查询、写入、DDL |
|
Iceberg Catalog |
Apache Iceberg |
3.2.8 |
HMS |
查询、写入、DDL |
|
Delta Catalog |
Delta Lake |
3.2.8 |
HMS |
仅查询 |
|
MySQL Catalog |
RDS MySQL、AnalyticDB for MySQL、StarRocks 等 MySQL 协议兼容数据库 |
3.2.8 |
不涉及(JDBC 直连) |
仅查询 |
前提条件
-
AnalyticDB for MySQL 集群处于运行状态,且版本满足所选 Catalog 类型的集群版本要求。
-
已开启 ENI 网络访问。
-
OSS Bucket 与集群在同一地域(同地域 VPC 默认可通过内网访问 OSS)。
-
使用 HMS 作为元数据服务时:集群与 HMS 在同一 VPC 内,且 HMS 所在安全组已放行集群 ENI 网段的访问。
-
使用 DLF 2.5 作为元数据服务时:AnalyticDB for MySQL 集群所在 VPC 已加入 DLF 白名单,且在 DLF 控制台 数据权限 中给服务关联角色
AliyunServiceRoleForAnalyticDBForMySQL授予目标 Catalog 的权限(预置权限类型选择 Data Editor)。 -
使用 MySQL Catalog 时:目标数据库的安全组或白名单已放行集群 ENI 网段的 IP 地址。
注意事项
CREATE EXTERNAL CATALOG 仅校验 SQL 语法和参数格式,不验证底层数据源真实连通性。即使 OSS 路径不存在或 Metastore 地址错误,命令也会返回成功;后续在该 Catalog 上执行查询时才会报错。建议创建后立即执行 SHOW DATABASES FROM <catalog_name> 验证连通性。
Hive Catalog
Hive Catalog 用于查询和管理 Apache Hive 数据,自 AnalyticDB for MySQL 3.2.8 版本起支持,仅支持 HMS 作为元数据服务。
语法
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "hive",
"metastore-uri" = "<hms_thrift_uri>"
);
|
参数 |
必填 |
说明 |
|
|
是 |
Catalog 类型,固定为 |
|
|
是 |
Hive Metastore 的 Thrift 服务地址,格式为 |
示例
CREATE EXTERNAL CATALOG hive_hms
PROPERTIES
(
"type" = "hive",
"metastore-uri" = "thrift://hms-host:9083"
);
DDL 与 DML 操作
自 AnalyticDB for MySQL 3.2.8 版本起,Hive Catalog 支持以下操作:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS <catalog_name>.<db_name>;
-- 创建表(仅支持 PARQUET 格式)
CREATE TABLE IF NOT EXISTS <catalog_name>.<db_name>.<table_name> (
<col1> <data_type>,
<col2> <data_type>
)
STORED AS PARQUET;
-- 写入数据
INSERT INTO <catalog_name>.<db_name>.<table_name> VALUES (...);
-- 批量写入
INSERT INTO <catalog_name>.<db_name>.<table_name>
SELECT * FROM <source_catalog>.<source_db>.<source_table>;
-- CTAS
CREATE TABLE <catalog_name>.<db_name>.<new_table>
AS SELECT * FROM <source_catalog>.<source_db>.<source_table>;
-- 删除表 / 数据库
DROP TABLE IF EXISTS <catalog_name>.<db_name>.<table_name>;
DROP DATABASE IF EXISTS <catalog_name>.<db_name>;
Iceberg Catalog
Iceberg Catalog 用于查询和管理 Apache Iceberg 数据,自 AnalyticDB for MySQL 3.2.8 版本起支持,仅支持 HMS 作为元数据服务。
语法
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "iceberg",
"metastore-uri" = "thrift://<host>:<port>"
);
参数说明同 Hive Catalog,将 type 改为 iceberg。
示例
CREATE EXTERNAL CATALOG iceberg_hms
PROPERTIES
(
"type" = "iceberg",
"metastore-uri" = "thrift://hms-host:9083"
);
DDL 与 DML 操作
自 AnalyticDB for MySQL 3.2.8 版本起,Iceberg Catalog 支持的 DDL/DML 操作与 Hive Catalog 一致。建表时使用 STORED AS ICEBERG 指定表格式:
CREATE TABLE IF NOT EXISTS <catalog_name>.<db_name>.<table_name> (
<col1> <data_type>,
<col2> <data_type>
)
STORED AS ICEBERG;
Delta Catalog
Delta Catalog 用于查询 Delta Lake 格式的数据,自 AnalyticDB for MySQL 3.2.8 版本起支持,仅支持 HMS 作为元数据服务,仅支持查询,不支持写入和 DDL 操作。
语法
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "delta",
"metastore-uri" = "thrift://<host>:<port>"
);
参数说明同 Hive Catalog,将 type 改为 delta。
示例
CREATE EXTERNAL CATALOG delta_hms
PROPERTIES
(
"type" = "delta",
"metastore-uri" = "thrift://hms-host:9083"
);
Paimon Catalog
Paimon Catalog 用于查询和管理 Apache Paimon 数据,自 AnalyticDB for MySQL 3.2.7 版本起支持。相比其他 Catalog 类型,Paimon Catalog 支持更多元数据服务,包括 FileSystem、HMS 和 DLF 2.5。自 3.2.8 版本起支持写入与 DDL 操作。
支持的元数据服务
|
元数据服务 |
说明 |
|
FileSystem |
Paimon 将元数据直接存储在数据仓库目录中,无需额外的元数据服务。适合轻量级场景。 |
|
DLF 2.5 |
阿里云数据湖构建(DLF 2.5)服务,提供统一的元数据管理能力。推荐在生产环境中使用。 |
|
HMS |
Hive Metastore 服务,适用于已有 Hadoop 生态的场景。 |
FileSystem(无独立元数据服务)
Paimon 将元数据直接存储在数据仓库目录中,适合轻量级场景。
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "paimon",
"paimon.catalog.metastore" = "filesystem",
"paimon.catalog.warehouse" = "oss://<bucket>/<path>/",
-- 可选优化参数
"paimon.enable_raw_delete_vector" = "true",
"paimon.enable_metadata_cache" = "true",
"paimon.enable_bucket_join" = "true",
"paimon.meta_cache_expired_time" = "1800"
);
-- 示例
CREATE EXTERNAL CATALOG paimon_oss
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "paimon",
"paimon.catalog.metastore" = "filesystem",
"paimon.catalog.warehouse" = "oss://my-bucket/paimon/warehouse/"
);
DLF 2.5(推荐生产场景)
使用阿里云数据湖构建(DLF 2.5)作为统一元数据服务。
DLF 1.0 暂不支持,请使用 DLF 2.5 及以上版本。
使用前提:
-
已开通 DLF 2.5 服务,并在 DLF 控制台 数据目录 中创建对应 Catalog,后续
paimon.catalog.warehouse参数填写该 Catalog 名称。 -
在 DLF 控制台 数据权限 中,给 AnalyticDB for MySQL 服务关联角色
AliyunServiceRoleForAnalyticDBForMySQL授予目标 Catalog 的权限:预置权限类型选择 Data Editor。
语法
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "paimon",
"paimon.catalog.metastore" = "rest",
"paimon.catalog.warehouse" = "<dlf_catalog_name>",
"paimon.catalog.uri" = "<dlf_endpoint>",
"paimon.catalog.token.provider" = "dlf",
-- 以下参数在非托管认证场景下需要手动指定
"paimon.catalog.dlf.access-key-id" = "<access_key_id>",
"paimon.catalog.dlf.access-key-secret" = "<access_key_secret>"
);
参数说明
|
参数 |
必填 |
说明 |
|
|
是 |
Catalog 类型,固定为 |
|
|
是 |
Paimon Catalog 引擎类型,固定为 |
|
|
是 |
元数据存储类型,使用 DLF 2.5 时设置为 |
|
|
是 |
DLF 中的 Catalog 名称(非 OSS 路径)。 |
|
|
是 |
DLF 服务的 VPC 内网 Endpoint,无需添加协议前缀,格式为 |
|
|
是 |
Token 提供方式,固定为 |
|
|
否 |
阿里云 AccessKey ID。当 AnalyticDB for MySQL 集群使用托管认证时,无需指定此参数。 |
|
|
否 |
阿里云 AccessKey Secret。当 AnalyticDB for MySQL 集群使用托管认证时,无需指定此参数。 |
示例
使用托管认证:
CREATE EXTERNAL CATALOG paimon_catalog_dlf
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "paimon",
"paimon.catalog.metastore" = "rest",
"paimon.catalog.warehouse" = "my_paimon_catalog",
"paimon.catalog.uri" = "cn-hangzhou-vpc.dlf.aliyuncs.com",
"paimon.catalog.token.provider" = "dlf"
);
手动指定 AccessKey:
CREATE EXTERNAL CATALOG paimon_catalog_dlf
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "paimon",
"paimon.catalog.metastore" = "rest",
"paimon.catalog.warehouse" = "my_paimon_catalog",
"paimon.catalog.uri" = "cn-hangzhou-vpc.dlf.aliyuncs.com",
"paimon.catalog.token.provider" = "dlf",
"paimon.catalog.dlf.access-key-id" = "<your_access_key_id>",
"paimon.catalog.dlf.access-key-secret" = "<your_access_key_secret>"
);
HMS(已有 Hadoop 生态场景)
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "paimon",
"paimon.catalog.type" = "paimon",
"paimon.catalog.metastore" = "hive",
"paimon.catalog.metastore.thrift.uri.selection" = "SEQUENTIAL",
"paimon.catalog.warehouse" = "oss://<bucket>/<path>/",
"paimon.catalog.uri" = "thrift://<hms_host>:<port>"
);
paimon.catalog.metastore.thrift.uri.selection 当前版本必须设置为 SEQUENTIAL。设置为 Random 可能导致 HMS 连接失败。
关键参数说明
|
参数 |
必填 |
说明 |
|
|
是 |
固定为 |
|
|
是 |
元数据存储类型,取值 |
|
|
是 |
FileSystem/HMS 模式:Paimon 数据仓库的 OSS 路径 |
|
|
否 |
是否启用元数据缓存,默认 |
|
|
否 |
元数据缓存过期时间(秒),默认 |
|
|
否 |
是否启用 Bucket Join 优化,默认 |
|
|
否 |
是否启用原始删除向量优化,默认 |
DDL 与 DML 操作
自 3.2.8 版本起,Paimon Catalog 支持以下操作。Paimon 表通过 TBLPROPERTIES 子句指定表属性(如 primary-key、partition、bucket 等),支持 Append Only、主键表(MOR/COW/MOW)、聚合表和 First Row 表多种类型。
CREATE TABLE IF NOT EXISTS <catalog_name>.<db_name>.<table_name> (
order_key BIGINT,
order_status VARCHAR,
total_price DOUBLE,
order_date DATE
)
TBLPROPERTIES (
'file.format' = 'PARQUET',
'partition' = 'order_date',
'bucket' = '2',
'bucket-key' = 'order_key'
);
MySQL Catalog
MySQL Catalog 通过 JDBC 协议直接查询 MySQL 协议兼容的外部数据库(RDS MySQL、AnalyticDB for MySQL 另一实例、StarRocks),自 AnalyticDB for MySQL 3.2.8 版本起支持,无需元数据服务,仅支持查询。
支持的数据源
|
数据源 |
说明 |
|
RDS MySQL |
阿里云关系型数据库 MySQL 版,使用标准 MySQL 端口(默认 3306)连接。 |
|
AnalyticDB for MySQL |
另一个 AnalyticDB for MySQL 实例,使用标准 MySQL 端口(默认 3306)连接。 |
|
StarRocks |
通过 MySQL 协议连接 StarRocks FE 节点(默认端口 9030),需启用 MariaDB 驱动。 |
语法
CREATE EXTERNAL CATALOG <catalog_name>
PROPERTIES
(
"type" = "mysql",
"connection-url" = "jdbc:mysql://<host>:<port>",
"connection-user" = "<username>",
"connection-password" = "<password>"
-- 连接 StarRocks 时追加:
-- , "mysql.use-mariadb-driver" = "true"
);
|
参数 |
必填 |
说明 |
|
|
是 |
固定为 |
|
|
是 |
目标数据库的 JDBC 连接地址,必须以 |
|
|
是 |
目标数据库的账号与密码。 |
|
|
否 |
是否使用 MariaDB JDBC 驱动,默认 |
示例
-- 连接 RDS MySQL
CREATE EXTERNAL CATALOG rds_mysql_catalog
PROPERTIES
(
"type" = "mysql",
"connection-url" = "jdbc:mysql://rm-bp1xxxxxxx.mysql.rds.aliyuncs.com:3306",
"connection-user" = "<your_username>",
"connection-password" = "<your_password>"
);
-- 连接另一个 AnalyticDB MySQL 实例
CREATE EXTERNAL CATALOG adb_mysql_catalog
PROPERTIES
(
"type" = "mysql",
"connection-url" = "jdbc:mysql://am-bp1xxxxxxx.ads.aliyuncs.com:3306",
"connection-user" = "<your_username>",
"connection-password" = "<your_password>"
);
-- 连接 StarRocks(FE 默认端口 9030,必须启用 MariaDB 驱动)
CREATE EXTERNAL CATALOG sr_catalog
PROPERTIES
(
"type" = "mysql",
"connection-url" = "jdbc:mysql://fe-host:9030",
"connection-user" = "<your_username>",
"connection-password" = "<your_password>",
"mysql.use-mariadb-driver" = "true"
);
管理 External Catalog
查看与删除
-- 查看 External Catalog 的创建语句
SHOW CREATE CATALOG <catalog_name>;
-- 删除 External Catalog(不影响外部数据源原始数据)
DROP CATALOG <catalog_name>;
权限控制
External Catalog 提供独立的 Catalog 级权限控制:
-- 授权
GRANT <privilege> ON CATALOG <catalog_name> TO '<user_name>'@'%';
-- 回收
REVOKE <privilege> ON CATALOG <catalog_name> FROM '<user_name>'@'%';
|
权限 |
作用 |
|
|
访问 Catalog 下的库表 |
|
|
创建 Catalog |
|
|
删除 Catalog |
|
|
修改 Catalog |
数据导入与查询示例
从外部数据源导入到 AnalyticDB for MySQL 内表
使用 INSERT INTO ... SELECT 将 External Catalog 中的数据导入 AnalyticDB for MySQL 内表,适用于所有类型的 External Catalog。
INSERT INTO <adb_db>.<adb_table>
SELECT * FROM <catalog_name>.<lake_db>.<lake_table>;
-- 从 Hive Catalog 导入数据
INSERT INTO analytics_db.orders_adb
SELECT * FROM hive_hms.warehouse_db.orders;
-- 从 Iceberg Catalog 导入数据
INSERT INTO analytics_db.events_adb
SELECT * FROM iceberg_hms.lakehouse.events;
-- 从 Delta Catalog 导入数据
INSERT INTO analytics_db.transactions_adb
SELECT * FROM delta_hms.finance_db.transactions;
-- 从 Paimon Catalog 导入数据
INSERT INTO analytics_db.lineitem_adb
SELECT * FROM paimon_oss.tpch.lineitem;
Hive Catalog 查询示例
-- 查看 Hive Catalog 中的数据库
SHOW DATABASES FROM hive_hms;
-- 查询 Hive 表数据
SELECT
order_id,
customer_name,
order_date,
total_amount
FROM hive_hms.sales_db.orders
WHERE order_date >= '2024-01-01'
ORDER BY total_amount DESC
LIMIT 100;
Iceberg Catalog 查询示例
-- 查看 Iceberg Catalog 中的数据库
SHOW DATABASES FROM iceberg_hms;
-- 查询 Iceberg 表数据
SELECT
event_type,
COUNT(*) AS event_count,
AVG(duration_ms) AS avg_duration
FROM iceberg_hms.lakehouse.user_events
WHERE event_date >= '2024-01-01'
GROUP BY event_type
ORDER BY event_count DESC;
Delta Catalog 查询示例
-- 查看 Delta Catalog 中的数据库
SHOW DATABASES FROM delta_hms;
-- 查询 Delta 表数据
SELECT
product_category,
SUM(revenue) AS total_revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM delta_hms.finance_db.transactions
WHERE transaction_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY product_category
ORDER BY total_revenue DESC;
Paimon Catalog 查询示例
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) AS count_order
FROM paimon_oss.tpch.lineitem
WHERE l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
GROUP BY l_returnflag, l_linestatus
ORDER BY l_returnflag, l_linestatus;
MySQL Catalog 查询示例
-- 查看 MySQL Catalog 中的数据库
SHOW DATABASES FROM rds_mysql_catalog;
-- 直接查询 RDS MySQL 中的表
SELECT
user_id,
username,
email,
created_at
FROM rds_mysql_catalog.user_db.users
WHERE created_at >= '2024-01-01'
ORDER BY created_at DESC
LIMIT 100;
湖仓联邦查询
在同一 SQL 中关联内表与外部 Catalog 表:
SELECT
u.username,
u.email,
COUNT(o.order_id) AS order_count,
SUM(o.total_amount) AS total_spent
FROM
rds_mysql_catalog.user_db.users u
JOIN
analytics_db.orders o ON u.user_id = o.user_id
GROUP BY u.username, u.email
ORDER BY total_spent DESC
LIMIT 50;
常见问题
Q:External Catalog 支持写入和 DDL 操作吗?
A:Paimon、Hive、Iceberg Catalog 自 3.2.8 版本起支持写入与 DDL 操作。Delta Catalog 和 MySQL Catalog 当前仅支持查询。如需将不支持写入的 Catalog 中的数据持久化到 AnalyticDB for MySQL,请使用 INSERT INTO ... SELECT 导入内表。
Q:Hive / Iceberg / Delta Catalog 是否支持 FileSystem 或 DLF?
A:当前仅支持 HMS 作为元数据服务。如需使用 FileSystem 或 DLF,请使用 Paimon Catalog。
Q:连接 HMS 失败怎么办?
A:依次检查 ENI 网络访问是否开启、AnalyticDB for MySQL 集群与 HMS 是否处于同一子网、HMS 安全组是否放行该子网 IP、metastore-uri 中的地址和端口是否正确。
Q:删除 Catalog 后,外部数据会被删除吗?
A:不会。DROP CATALOG 仅移除 AnalyticDB for MySQL 中的 Catalog 定义和元数据缓存,不影响外部数据源中的原始数据。
Q:MySQL Catalog 连 StarRocks 为什么必须启用 MariaDB 驱动?
A:StarRocks 的 MySQL 协议实现基于 MariaDB,使用默认的 MySQL JDBC 驱动可能导致兼容性问题。将 mysql.use-mariadb-driver 设置为 true 可确保连接正常工作。
Q:CREATE EXTERNAL CATALOG 成功了,为什么后续查询报错?
A:Catalog 创建仅校验 SQL 语法和参数格式,不会真正连接底层数据源。建议创建完成后立即执行 SHOW DATABASES FROM <catalog_name> 验证连通性。常见原因包括 OSS Bucket 不存在或权限不足、Metastore 地址错误、ENI 未开启、目标数据库防火墙未放行等。
相关文档
-
Catalog 概述:了解 Catalog 的整体设计与分类。
-
Managed Catalog:管理 AnalyticDB for MySQL 实例内部数据。