External Catalog

更新时间:
复制 MD 格式

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

  • FileSystem

  • HMS

  • DLF 2.5

查询、写入、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>"
);

参数

必填

说明

type

Catalog 类型,固定为 hive

metastore-uri

Hive Metastore 的 Thrift 服务地址,格式为 thrift://<host>:<port>

示例

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 及以上版本。

使用前提:

  1. 已开通 DLF 2.5 服务,并在 DLF 控制台 数据目录 中创建对应 Catalog,后续 paimon.catalog.warehouse 参数填写该 Catalog 名称。

  2. 在 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>"
);

参数说明

参数

必填

说明

type

Catalog 类型,固定为 paimon

paimon.catalog.type

Paimon Catalog 引擎类型,固定为 paimon

paimon.catalog.metastore

元数据存储类型,使用 DLF 2.5 时设置为 rest

paimon.catalog.warehouse

DLF 中的 Catalog 名称(非 OSS 路径)。

paimon.catalog.uri

DLF 服务的 VPC 内网 Endpoint,无需添加协议前缀,格式为 <region>-vpc.dlf.aliyuncs.com,例如 cn-hangzhou-vpc.dlf.aliyuncs.com

paimon.catalog.token.provider

Token 提供方式,固定为 dlf

paimon.catalog.dlf.access-key-id

阿里云 AccessKey ID。当 AnalyticDB for MySQL 集群使用托管认证时,无需指定此参数。

paimon.catalog.dlf.access-key-secret

阿里云 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 连接失败。

关键参数说明

参数

必填

说明

type

固定为 paimon

paimon.catalog.metastore

元数据存储类型,取值 filesystemhiverest(DLF 2.5)。

paimon.catalog.warehouse

FileSystem/HMS 模式:Paimon 数据仓库的 OSS 路径 oss://<bucket>/<path>/;DLF 模式:DLF 中的 Catalog 名称。

paimon.enable_metadata_cache

是否启用元数据缓存,默认 false。开启可减少 OSS 元数据请求次数。

paimon.meta_cache_expired_time

元数据缓存过期时间(秒),默认 1800。仅在 paimon.enable_metadata_cache=true 时生效。

paimon.enable_bucket_join

是否启用 Bucket Join 优化,默认 false。Paimon 表使用 Bucket 分区时启用可加速 Join 查询。

paimon.enable_raw_delete_vector

是否启用原始删除向量优化,默认 false。带删除操作的表开启后查询性能更佳。

DDL 与 DML 操作

自 3.2.8 版本起,Paimon Catalog 支持以下操作。Paimon 表通过 TBLPROPERTIES 子句指定表属性(如 primary-keypartitionbucket 等),支持 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"
);

参数

必填

说明

type

固定为 mysql

connection-url

目标数据库的 JDBC 连接地址,必须以 jdbc:mysql:// 开头。

connection-user / connection-password

目标数据库的账号与密码。

mysql.use-mariadb-driver

是否使用 MariaDB JDBC 驱动,默认 false连接 StarRocks 时必须设置为 true,否则可能因 StarRocks MySQL 协议基于 MariaDB 实现而出现兼容性问题。

示例

-- 连接 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>'@'%';

权限

作用

ACCESS

访问 Catalog 下的库表

CREATE

创建 Catalog

DROP

删除 Catalog

ALTER

修改 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 未开启、目标数据库防火墙未放行等。

相关文档