本文通过 一份可直接运行的 Shell 脚本 ,完成 Hive Metastore 在 MySQL 8 上的创建、配置、驱动替换和 schema 初始化,适合生产与集群环境。
一、环境说明
1️⃣ 软件版本
| 组件 | 版本 |
|---|---|
| Hive | 3.x |
| MySQL | 8.x |
| JDBC 驱动 | mysql-connector-java 8.x |
| JDK | 1.8+ |
2️⃣ 目录规划
bash
Hive 安装目录: /opt/hive
Hive lib 目录: /opt/hive/lib
Hive 配置目录: /opt/hive/conf
3️⃣ MySQL 前置检查
bash
systemctl status mysqld
未启动则:
bash
systemctl start mysqld
systemctl enable mysqld
二、完整 Hive Metastore 初始化 Shell 脚本(原样保留)
✅ 特点
- 使用 MySQL 8 官方 CJ 驱动
- 自动删除旧 5.x 驱动
- 自动创建 metastore 数据库
- 自动创建 hive 用户并授权
- 自动初始化 schema
- 避免 XML 转义、时区、认证问题
📌 完整 Shell 脚本(你的原始版本)
bash
#!/bin/bash
# 配置 Hive Metastore 并初始化(使用 com.mysql.cj.jdbc.Driver)
set -e
# =================== 配置区域 ===================
HIVE_HOME="/opt/hive"
MYSQL_ROOT_PASSWORD="YFSTpiGxS2%j"
MYSQL_NODE="node1"
MYSQL_JDBC_VERSION="8.0.12" # MySQL JDBC 驱动版本
# Hive Metastore 用户配置
HIVE_DB="metastore"
HIVE_USER="hive"
HIVE_PASSWORD="Hive123!" # 必须符合 MySQL 密码策略
RESET_METASTORE=false # true -> 删除已有 Metastore 并重新初始化
FORCE_XML_UPDATE=false # true -> 强制更新 hive-site.xml(即使文件存在)
FIX_XML_ONLY=false # true -> 只修复 XML 转义,不初始化 schema
# ===============================================
echo "=== Hive Metastore 配置(CJ 驱动) ==="
# 创建临时 MySQL 配置文件,隐藏密码
TMP_MY_CNF="/tmp/mysql_hive.cnf"
cat > "$TMP_MY_CNF" <<EOF
[client]
user=root
password=$MYSQL_ROOT_PASSWORD
EOF
# 确保 MySQL 已启动
echo ">>> 启动 MySQL..."
systemctl start mysqld && echo "✅ MySQL 启动完成"
# 删除旧 MySQL 驱动
echo ">>> 删除旧 MySQL JDBC 驱动(5.x)..."
rm -f "$HIVE_HOME/lib/mysql-connector-java-5.1.*.jar" && echo "✅ 已删除旧驱动"
# 下载 MySQL 8.x 驱动(CJ 驱动)
JDBC_JAR_NAME="mysql-connector-java-${MYSQL_JDBC_VERSION}.jar"
if [ ! -f "$HIVE_HOME/lib/$JDBC_JAR_NAME" ]; then
echo ">>> 下载 MySQL Connector/J $MYSQL_JDBC_VERSION..."
wget -q "https://repo1.maven.org/maven2/mysql/mysql-connector-java/${MYSQL_JDBC_VERSION}/$JDBC_JAR_NAME" -P /tmp
cp "/tmp/$JDBC_JAR_NAME" "$HIVE_HOME/lib/"
echo "✅ MySQL 8.x 驱动下载并放入 Hive lib"
else
echo "✅ MySQL 8.x 驱动已存在,跳过下载"
fi
# 如果选择重置 Metastore,则先删除数据库
if [ "$RESET_METASTORE" = true ]; then
echo ">>> 重置 Hive Metastore 数据库..."
mysql --defaults-extra-file="$TMP_MY_CNF" -e "DROP DATABASE IF EXISTS $HIVE_DB;" && \
echo "✅ Hive Metastore 数据库已删除"
fi
# 创建数据库
echo ">>> 创建 Hive Metastore 数据库..."
mysql --defaults-extra-file="$TMP_MY_CNF" -e "CREATE DATABASE IF NOT EXISTS $HIVE_DB;" && \
echo "✅ Hive Metastore 数据库创建完成或已存在"
# 创建/更新用户
USER_EXIST=$(mysql --defaults-extra-file="$TMP_MY_CNF" -e "SELECT User FROM mysql.user WHERE User='$HIVE_USER';" | grep "$HIVE_USER" || true)
if [ -z "$USER_EXIST" ]; then
mysql --defaults-extra-file="$TMP_MY_CNF" -e "CREATE USER '$HIVE_USER'@'%' IDENTIFIED BY '$HIVE_PASSWORD';"
mysql --defaults-extra-file="$TMP_MY_CNF" -e "GRANT ALL PRIVILEGES ON $HIVE_DB.* TO '$HIVE_USER'@'%';"
mysql --defaults-extra-file="$TMP_MY_CNF" -e "FLUSH PRIVILEGES;"
echo "✅ Hive 用户 $HIVE_USER 创建完成"
else
# 更新密码以防 Hive 用户密码不一致
mysql --defaults-extra-file="$TMP_MY_CNF" -e "ALTER USER '$HIVE_USER'@'%' IDENTIFIED BY '$HIVE_PASSWORD';"
echo "✅ Hive 用户 $HIVE_USER 已存在,密码已更新"
fi
# 配置 hive-site.xml
HIVE_SITE_FILE="$HIVE_HOME/conf/hive-site.xml"
cat > "$HIVE_SITE_FILE" <<EOF
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://$MYSQL_NODE:3306/$HIVE_DB?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>$HIVE_USER</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>$HIVE_PASSWORD</value>
</property>
</configuration>
EOF
# 初始化 Hive Metastore(跳过如果只修复 XML)
if [ "$FIX_XML_ONLY" = false ]; then
if [ "$RESET_METASTORE" = true ]; then
echo ">>> 重置并初始化 Hive Metastore 元数据库表..."
$HIVE_HOME/bin/schematool -dbType mysql -initSchema
echo "✅ Hive Metastore 元数据库已重置并初始化完成"
else
$HIVE_HOME/bin/schematool -dbType mysql -info &>/dev/null || {
echo ">>> 初始化 Hive Metastore 元数据库表..."
$HIVE_HOME/bin/schematool -dbType mysql -initSchema
echo "✅ Hive Metastore 元数据库初始化完成"
}
fi
else
echo ">>> 跳过 schema 初始化(FIX_XML_ONLY 模式)"
fi
# 删除临时 MySQL 配置文件
rm -f "$TMP_MY_CNF"
echo "=== Hive Metastore 配置并初始化完成(CJ 驱动) ==="
三、脚本使用方式
1️⃣ 赋予执行权限
bash
chmod +x init-hive-metastore.sh
2️⃣ 执行初始化
bash
./init-hive-metastore.sh
3️⃣ 重置 Metastore(慎用)
bash
RESET_METASTORE=true ./init-hive-metastore.sh
四、验证是否成功
1️⃣ 进入 Hive
bash
hive
sql
show databases;
2️⃣ 检查 MySQL 表
bash
mysql -u hive -p metastore -e "show tables;"
能看到 DBS、TBLS、VERSION 等表即成功。
五、常见问题汇总(必看)
❌ 1. 驱动冲突
text
ClassNotFoundException: com.mysql.jdbc.Driver
✔ 已在脚本中自动删除 5.x 驱动
❌ 2. MySQL 8 认证失败
text
Public Key Retrieval is not allowed
✔ 使用 com.mysql.cj.jdbc.Driver
❌ 3. XML 解析错误
✔ 已正确使用 & 转义
六、总结
- ✔ 完整 Shell 自动化部署
- ✔ 适配 Hive 3.x + MySQL 8
- ✔ 生产环境可直接复用
- ✔ 一次执行,彻底避坑