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
  • ✔ 生产环境可直接复用
  • ✔ 一次执行,彻底避坑
相关推荐
ccecw4 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30734 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
Goat恶霸詹姆斯7 小时前
mysql常用语句
数据库·mysql·oracle
qq_12498707537 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
十月南城10 小时前
Hive与离线数仓方法论——分层建模、分区与桶的取舍与查询代价
数据仓库·hive·hadoop
洛豳枭薰10 小时前
Innodb一次更新动作
mysql
xcLeigh11 小时前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
Fleshy数模12 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
鹏说大数据12 小时前
Spark 和 Hive 的关系与区别
大数据·hive·spark
B站计算机毕业设计超人12 小时前
计算机毕业设计Hadoop+Spark+Hive招聘推荐系统 招聘大数据分析 大数据毕业设计(源码+文档+PPT+ 讲解)
大数据·hive·hadoop·python·spark·毕业设计·课程设计