Hive 元数据同步
更新时间:2026-07-24
1. 概述
本文介绍如何将源集群的 Hive Metastore 元数据同步到目标集群。本文只覆盖 Hive 元数据库迁移、LOCATION 改写、版本升级和启动校验。
适用场景:
- 目标集群已经完成数据迁移,需要将表的存储路径指向目标集群。
- Hive 版本相同,或需要从低版本 Hive Metastore 升级到高版本。
2. 同步前准备
同步前确认以下信息。
| 参数 | 说明 |
|---|---|
${SRC_MYSQL_HOST} |
源 Hive Metastore MySQL 地址 |
${SRC_HIVE_DB} |
源 Hive 元数据库名,常见为 hive 或 hivemeta |
${SRC_MYSQL_USER} |
源 MySQL 用户名 |
${SRC_MYSQL_PASSWORD} |
源 MySQL 密码 |
${SRC_LOCATION_PREFIX} |
源表路径前缀,例如 hdfs://oldcluster:8020/ |
${DST_MYSQL_HOST} |
目标 Hive Metastore MySQL 地址 |
${DST_HIVE_DB} |
目标 Hive 元数据库名,按目标集群实际配置填写 |
${DST_MYSQL_USER} |
目标 MySQL 用户名 |
${DST_MYSQL_PASSWORD} |
目标 MySQL 密码 |
${DST_LOCATION_PREFIX} |
目标表路径前缀,例如 hdfs://newcluster:8020/ |
注意事项:
- 同步窗口内停止源集群和目标集群的
hive-metastore、hive-server2,避免元数据继续变化。 - 目标 Hive 元数据库中已有的库表信息会被覆盖或合并,操作前必须确认目标库可清理或已备份。
- 如果源 Hive 和目标 Hive 版本不同,导入后必须执行 Metastore schema 升级。
3. 停止 Hive 服务
在源集群和目标集群所有 Hive 服务节点执行,或通过 Ambari/管控页面停止对应服务。
Bash
1systemctl stop hive-metastore
2systemctl stop hive-server2
停止后,依赖 Hive Metastore 的任务会失败,请在业务低峰或维护窗口执行。
4. 导出源元数据库
在可以访问源 MySQL 的节点执行:
Bash
1mysqldump -h ${SRC_MYSQL_HOST} -u${SRC_MYSQL_USER} -p"${SRC_MYSQL_PASSWORD}" \
2 --single-transaction ${SRC_HIVE_DB} > hive-metastore.sql
5. 改写表路径
如果数据迁移后 HDFS 地址或路径前缀发生变化,需要改写 Hive 元数据中的 LOCATION。以下命令在 Linux 节点执行。
Bash
1sed -i "s#${SRC_LOCATION_PREFIX}#${DST_LOCATION_PREFIX}#g" hive-metastore.sql
示例:
Bash
1sed -i 's#hdfs://oldcluster:8020/#hdfs://newcluster:8020/#g' hive-metastore.sql
改写后检查是否仍有源路径残留:
Bash
1grep -n "${SRC_LOCATION_PREFIX}" hive-metastore.sql
6. 导入目标元数据库
在目标 MySQL 中创建目标库,库名按目标集群实际配置填写。
SQL
1CREATE DATABASE IF NOT EXISTS `${DST_HIVE_DB}` DEFAULT CHARACTER SET utf8;
如果目标库中已有元数据,先确认可以清理或已完成备份,再删除重建:
SQL
1DROP DATABASE `${DST_HIVE_DB}`;
2CREATE DATABASE `${DST_HIVE_DB}` DEFAULT CHARACTER SET utf8;
导入改写后的元数据:
Bash
1mysql -h ${DST_MYSQL_HOST} -u${DST_MYSQL_USER} -p"${DST_MYSQL_PASSWORD}" ${DST_HIVE_DB} \
2 < hive-metastore.sql
7. 修改目标集群 Hive 配置
确认目标集群 hive-site.xml 指向目标 MySQL。
XML
1<property>
2 <name>javax.jdo.option.ConnectionDriverName</name>
3 <value>com.mysql.jdbc.Driver</value>
4</property>
5<property>
6 <name>javax.jdo.option.ConnectionURL</name>
7 <value>jdbc:mysql://${DST_MYSQL_HOST}/${DST_HIVE_DB}?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
8</property>
9<property>
10 <name>javax.jdo.option.ConnectionUserName</name>
11 <value>${DST_MYSQL_USER}</value>
12</property>
13<property>
14 <name>javax.jdo.option.ConnectionPassword</name>
15 <value>${DST_MYSQL_PASSWORD}</value>
16</property>
8. 跨版本升级 Metastore Schema
Hive 版本相同可跳过本节。
以 Hive 1.2 升级到 Hive 3.1 为例,在目标 Hive Metastore 节点执行:
Bash
1cd /opt/bmr/hive/scripts/metastore/upgrade/mysql
2
3mysql -h ${DST_MYSQL_HOST} -u${DST_MYSQL_USER} -p"${DST_MYSQL_PASSWORD}" ${DST_HIVE_DB}
在 MySQL 客户端中按版本顺序执行升级脚本:
SQL
1source upgrade-1.2.0-to-2.0.0.mysql.sql;
2source upgrade-2.0.0-to-2.1.0.mysql.sql;
3source upgrade-2.1.0-to-2.2.0.mysql.sql;
4source upgrade-2.2.0-to-2.3.0.mysql.sql;
5source upgrade-2.3.0-to-3.0.0.mysql.sql;
6source upgrade-3.0.0-to-3.1.0.mysql.sql;
部分升级脚本可能出现字段或表已存在的错误,例如 Duplicate column name、Table already exists。如果确认该对象已经存在且脚本继续执行到后续步骤,可按实际升级脚本说明处理;其他 SQL 错误需要先排查,不要直接忽略。
9. 启动并校验
启动目标集群 Hive 服务。
Bash
1systemctl start hive-metastore
2systemctl start hive-server2
使用 Beeline 或 Hive CLI 校验库表和路径。
SQL
1SHOW DATABASES;
2SHOW TABLES IN default;
3DESCRIBE FORMATTED default.table_name;
4SELECT * FROM default.table_name LIMIT 10;
重点检查:
DESCRIBE FORMATTED中的Location是否已经指向目标集群路径。- 外部表、分区表是否能正常查询。
- HiveServer2、Metastore 日志中是否有 schema、权限或路径访问错误。
确认目标集群读写正常后,再恢复业务提交。
评价此篇文章
