首批通过分布式安全可靠测评,为关键业务系统打造
Hive 表(HMS)
更新时间:2026-06-24 20:11:47
OceanBase 自 V4.4.1 版本起(MySQL 模式),支持通过 Hive Metastore(HMS)访问已在 HMS 中注册的 Hive 表。HMS 负责提供库、表、分区等元数据;表数据仍存放在 HDFS、OSS、S3 等外部存储中,OceanBase 不持有这些数据副本。
本文说明如何通过 HMS 接入并查询 Hive 表。HMS Catalog 的创建语法、Kerberos 认证及 Location 配置细节,参见 通过 Catalog 加载 Hive 表。
说明
当前仅 OceanBase MySQL 模式支持通过 HMS 访问 Hive 表。
功能简介
通过 HMS 访问 Hive 表时,OceanBase 的执行过程分为两步:
- 读取元数据:通过 HMS Catalog 连接 Hive Metastore,获取 Hive 库、表、分区及存储路径等信息。
- 读取数据文件:根据 HMS 返回的
LOCATION等信息,从外部存储读取 ORC、Parquet 等格式的数据文件。
该方式适用于已在 Hadoop 生态中由 Hive 管理的表,用户无需在 OceanBase 中逐表手工定义列结构与文件路径。
当前支持的操作:
| 操作 | 支持情况 |
|---|---|
SELECT 查询 |
支持 |
JOIN、GROUP BY 等分析语句 |
支持 |
| 与 OceanBase 内表联邦查询 | 支持 |
INSERT、UPDATE、DELETE |
不支持 |
DROP TABLE 等 DDL |
不支持 |
前提条件
- 版本与模式:OceanBase V4.4.1 及以上,MySQL 模式租户。
- HMS 服务:OceanBase 集群可访问 Hive Metastore(Thrift 协议)。HMS 地址与端口由运维侧提供;开源 Hive 默认端口为 9083,实际部署可能不同。
- 存储访问:所有 OBServer 节点对 Hive 表底层存储(HDFS、OSS、S3 等)具备读权限。底层存储为 HDFS 时,需部署 Java SDK 环境,参见 部署 OceanBase 数据库 JAVA SDK 环境。
- 权限:当前用户需具备
CREATE CATALOG、USE CATALOG等 Catalog 相关权限;若使用 Kerberos 或受限 HDFS 路径,需额外在 Location 中配置相关认证凭据。
HMS 外表访问模型
访问链路涉及三个层次,请勿混淆:
| 层次 | 作用 | 在 OceanBase 中的配置入口 |
|---|---|---|
| Catalog(HMS) | 连接 Hive Metastore,获取 Hive 表元数据 | CREATE EXTERNAL CATALOG ... TYPE = 'HMS' |
| Location(存储) | 访问 HDFS 等存储上的数据文件及认证 | CREATE LOCATION ...(按场景可选) |
| 湖表格式(Hive) | 表在 HMS 中的组织方式 | 由 HMS 侧已有表定义决定,OceanBase 读取元数据后访问 |
要点:
- HMS 是元数据服务,不是数据存储位置。
- Hive 表的数据文件存放在 HMS 元数据中记录的
LOCATION路径下。 - Catalog 权限与存储读权限相互独立:具备 Catalog 权限不代表一定能读取底层文件。
若 Hive 表数据位于权限受限的 HDFS 路径,或集群启用了 Kerberos,需分别配置 HMS Catalog 与 Location。配置方式参见 通过 Catalog 加载 Hive 表 中的认证说明。
操作步骤
步骤 1:创建 HMS Catalog
CREATE EXTERNAL CATALOG hive_prod
PROPERTIES (
TYPE = 'HMS',
URI = 'thrift://hms.example.com:9083'
);
若 HMS 或 HDFS 启用 Kerberos,需在 PROPERTIES 中补充 PRINCIPAL、KEYTAB、KRB5CONF 等参数。完整语法与参数说明参见 通过 Catalog 加载 Hive 表。
步骤 2:(可选)创建 Location
当 Hive 表数据位于需显式指定用户或 Kerberos 凭据的 HDFS 路径时,创建 Location:
CREATE LOCATION hdfs_sales
URL = 'hdfs://namenode:8020/'
CREDENTIAL (
USERNAME = 'hive'
);
如何确定 URL:在 Hive 中执行 SHOW CREATE TABLE db.table,从 LOCATION 字段提取存储根路径。
步骤 3:切换 Catalog 并查询
方式一:切换会话上下文
SET CATALOG hive_prod;
USE sales_db;
SELECT * FROM customer_log
WHERE dt = '20250401'
LIMIT 100;
方式二:使用三段式标识符
SELECT city, COUNT(*)
FROM hive_prod.sales_db.customer_log
WHERE dt >= '2025-04-01'
GROUP BY city;
步骤 4:联邦查询(可选)
SELECT o.order_id, h.city
FROM internal.trade_db.orders o
JOIN hive_prod.sales_db.customer h ON o.user_id = h.id;
查询示例
分区表查询
Hive 分区表的分区信息由 HMS 提供。查询时在 WHERE 子句中指定分区列,OceanBase 可下推分区裁剪,减少扫描范围。
SET CATALOG hive_prod;
USE sales_db;
SELECT product_id, SUM(amount)
FROM sales_detail
WHERE dt = '20250401' AND region = 'cn-east'
GROUP BY product_id;
查看表结构
DESC hive_prod.sales_db.sales_detail;
SHOW CREATE TABLE hive_prod.sales_db.sales_detail;
支持范围
Hive 表与文件格式
| 表类型 | 支持的文件格式 | 说明 |
|---|---|---|
| Hive 表 | ORC、Parquet、TextFile、CSV | 复杂类型当前版本仅支持 Parquet 格式的 ARRAY 类型 |
查询优化
在 HMS 元数据与存储访问正常的前提下,OceanBase 对 Hive 表查询支持:
- 分区裁剪:在
WHERE中指定分区列时,可缩小扫描范围。 - 列裁剪:仅读取
SELECT涉及的列(取决于文件格式)。 - 谓词下推:部分过滤条件下推至文件读取层(以执行计划为准)。
Hive 版本
支持 Hive 1.2.x、2.3.x、3.1.x、4.x。不同 Hive 版本下表定义与存储路径格式可能存在差异,以 HMS 中实际元数据为准。
注意事项
- 只读访问:通过 HMS 访问的 Hive 表均为只读,不支持向 Hive 表写入或修改 HMS 侧表结构。
- Catalog 与 Location 分层配置:HMS 连接失败与 HDFS 读权限不足是两类不同问题,需分别排查。
- 网络部署:HMS 与 OBServer 跨机房部署时,元数据获取延迟可能增加查询耗时;建议部署在同一低延迟网络内。
- 未注册到 HMS 的文件:若数据文件未在 HMS 中注册为 Hive 表,不能使用本文所述方式访问;应使用 文件外部表 或 URL 外部表。
- 与 HMS Catalog 文档的分工:本文侧重接入流程与查询使用;Kerberos、HDFS HA 等详细配置参见 通过 Catalog 加载 Hive 表。
相关文档
文档说明
- 本篇重点:说明 HMS 在 Hive 表访问链路中的角色,以及从创建 Catalog 到查询的操作流程与支持范围。
- 与另外两篇的边界:不涉及 Iceberg 表加载与能力说明(见 通过 Catalog 加载 Iceberg 表);不涉及 ODPS API 外表映射(见 ODPS 外部表)。HMS Catalog 的详细参数与认证配置见 通过 Catalog 加载 Hive 表,本篇不重复展开。