本文通过一份可直接运行的 Shell 脚本,完成 Hive Metastore 在 MySQL 8 上的创建、配置、驱动替换和 schema 初始化,适合生产与集群环境。
一、环境说明
1️⃣ 软件版本
| 组件 | 版本 |
|---|---|
| Hive | 3.x |
| MySQL | 8.x |
| JDBC 驱动 | mysql-connector-java 8.x |
| JDK | 1.8+ |
2️⃣ 目录规划
Hive 安装目录: /opt/hive Hive lib 目录: /opt/hive/lib Hive 配置目录: /opt/hive/conf3️⃣ MySQL 前置检查
systemctl status mysqld未启动则:
systemctl start mysqld systemctlenablemysqld二、完整 Hive Metastore 初始化 Shell 脚本(原样保留)
✅ 特点
- 使用MySQL 8 官方 CJ 驱动
- 自动删除旧 5.x 驱动
- 自动创建 metastore 数据库
- 自动创建 hive 用户并授权
- 自动初始化 schema
- 避免 XML 转义、时区、认证问题
📌完整 Shell 脚本(你的原始版本)
#!/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_PASSWORDEOF# 确保 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"];thenecho">>> 下载 MySQL Connector/J$MYSQL_JDBC_VERSION..."wget-q"https://repo1.maven.org/maven2/mysql/mysql-connector-java/${MYSQL_JDBC_VERSION}/$JDBC_JAR_NAME"-P /tmpcp"/tmp/$JDBC_JAR_NAME""$HIVE_HOME/lib/"echo"✅ MySQL 8.x 驱动下载并放入 Hive lib"elseecho"✅ MySQL 8.x 驱动已存在,跳过下载"fi# 如果选择重置 Metastore,则先删除数据库if["$RESET_METASTORE"=true];thenecho">>> 重置 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"];thenmysql --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.xmlHIVE_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];thenif["$RESET_METASTORE"=true];thenecho">>> 重置并初始化 Hive Metastore 元数据库表..."$HIVE_HOME/bin/schematool -dbType mysql -initSchemaecho"✅ Hive Metastore 元数据库已重置并初始化完成"else$HIVE_HOME/bin/schematool -dbType mysql -info&>/dev/null||{echo">>> 初始化 Hive Metastore 元数据库表..."$HIVE_HOME/bin/schematool -dbType mysql -initSchemaecho"✅ Hive Metastore 元数据库初始化完成"}fielseecho">>> 跳过 schema 初始化(FIX_XML_ONLY 模式)"fi# 删除临时 MySQL 配置文件rm-f"$TMP_MY_CNF"echo"=== Hive Metastore 配置并初始化完成(CJ 驱动) ==="三、脚本使用方式
1️⃣ 赋予执行权限
chmod+x init-hive-metastore.sh2️⃣ 执行初始化
./init-hive-metastore.sh3️⃣ 重置 Metastore(慎用)
RESET_METASTORE=true ./init-hive-metastore.sh四、验证是否成功
1️⃣ 进入 Hive
hiveshowdatabases;2️⃣ 检查 MySQL 表
mysql -u hive -p metastore -e"show tables;"能看到DBS、TBLS、VERSION等表即成功。
五、常见问题汇总(必看)
❌ 1. 驱动冲突
ClassNotFoundException: com.mysql.jdbc.Driver✔ 已在脚本中自动删除 5.x 驱动
❌ 2. MySQL 8 认证失败
Public Key Retrieval is not allowed✔ 使用com.mysql.cj.jdbc.Driver
❌ 3. XML 解析错误
✔ 已正确使用&转义
六、总结
- ✔完整 Shell 自动化部署
- ✔ 适配 Hive 3.x + MySQL 8
- ✔ 生产环境可直接复用
- ✔ 一次执行,彻底避坑