Hive Metastore 使用 MySQL 8(CJ 驱动)完整配置实战(含完整 Shell 脚本)

本文通过 一份可直接运行的 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&amp;useSSL=false&amp;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;"

能看到 DBSTBLSVERSION 等表即成功。


五、常见问题汇总(必看)

❌ 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 解析错误

✔ 已正确使用 &amp; 转义


六、总结

  • 完整 Shell 自动化部署
  • ✔ 适配 Hive 3.x + MySQL 8
  • ✔ 生产环境可直接复用
  • ✔ 一次执行,彻底避坑
相关推荐
我真的是大笨蛋2 小时前
MVCC解析
java·数据库·spring boot·sql·mysql·设计模式·设计规范
强子感冒了2 小时前
MySQL学习笔记:索引和数据库设计
数据库·学习·mysql
zgl_200537792 小时前
源代码:ZGLanguage 解析SQL数据血缘 之 显示 MERGE SQL 结构图
数据库·数据仓库·hive·数据治理·etl·sql解析·数据血缘
Gain_chance2 小时前
24-学习笔记尚硅谷数仓搭建-DIM层的维度表建表思路及商品表维度表的具体建表解析
数据仓库·hive·笔记·学习·datagrip
FJW0208142 小时前
关系型数据库大王Mysql——SQL编程
数据库·sql·mysql
爱技术的小伙子2 小时前
【 Docker 快速部署 MySQL 8.0(2026最新实践)—— 一键启动 + 数据持久化 + 常见优化】
mysql·adb·docker
heze092 小时前
sqli-labs-Less-26
数据库·mysql·网络安全
ahauedu3 小时前
在 MySQL 中设置 `max_allowed_packet` 参数的几种方法
数据库·mysql
无名修道院3 小时前
AI大模型应用开发-用 MySQL 存储简单数据,用 Python 操作数据库
数据库·python·mysql·ai大模型应用开发