本文详细记录了在WSL Ubuntu环境下安装配置Hive 3.1.3的全过程。
主要内容包括:
环境准备,确认Hadoop 3.3.6和Java 8正常运行;
从华为云镜像下载Hive并配置环境变量;
解决MySQL认证问题并设置root密码;
下载新版MySQL JDBC驱动并配置hive-site.xml;
处理Java版本兼容性问题,最终切换至Java 8;
通过清理临时文件、重新格式化NameNode等操作解决Hadoop启动问题;
成功启动Hive并完成基础测试,包括创建数据库、表和导入数据等操作。
整个过程涵盖了多个常见问题的解决方案,为在WSL环境下搭建Hive提供了完整参考。
AI 总结版(更简洁)在这
在 WSL Ubuntu 上安装和使用 Hive
根据你的课堂笔记,以下是在你已配置好的 Hadoop 环境上安装和使用 Hive 的完整步骤。
一、环境确认
你已经完成:
-
✅ Hadoop 3.3.6 运行正常
-
✅ Java 11 已配置
-
✅ WSL Ubuntu 环境
bash
bash
# 确认 Hadoop 运行正常
jps
# 应该看到 NameNode, DataNode, ResourceManager, NodeManager
二、下载并安装 Hive
2.1 下载 Hive
bash
bash
cd ~/downloads
# 使用清华镜像下载 Hive 3.1.3(稳定版本,与 Hadoop 3.3.x 兼容)
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# 查看下载文件
ls -lh apache-hive-3.1.3-bin.tar.gz
第一个坑
清华镜像源里没有 Hive 3.1.3 的安装包。
清华镜像源里没有 Hive 3.1.3 的安装包
bash
mumu@MuJinqiu:~$ start-hadoop.sh
=========================================
Starting Hadoop Cluster
=========================================
1. Starting SSH service...
[sudo] password for mumu:
2. Starting Hadoop...
WARNING: Attempting to start all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [MuJinqiu]
Starting resourcemanager
Starting nodemanagers
3. Waiting 30 seconds for services...
4. Checking Hadoop processes...
1158049 SecondaryNameNode
1157649 NameNode
1157831 DataNode
1158296 ResourceManager
1158636 NodeManager
1159023 Jps
=========================================
✅ Hadoop is ready!
- HDFS UI: http://localhost:9870
- YARN UI: http://localhost:8088
=========================================
mumu@MuJinqiu:~$ cd ~/downloads
mumu@MuJinqiu:~/downloads$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
--2026-05-20 16:13:42-- https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
Resolving mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.15.130, 2402:f000:1:400::2
Connecting to mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.15.130|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2026-05-20 16:13:42 ERROR 404: Not Found.
mumu@MuJinqiu:~/downloads$ ls -lh apache-hive-3.1.3-bin.tar.gz
ls: cannot access 'apache-hive-3.1.3-bin.tar.gz': No such file or directory
mumu@MuJinqiu:~/downloads$
清华镜像源里确实没有 Hive 3.1.3 的安装包,但我们可以换一个国内镜像源继续下载。
换个镜像源下载
先用华为云的镜像源试试,在终端执行这个命令:
bash
wget https://repo.huaweicloud.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
华为云镜像速度通常不错,如果这个还是慢,可以再用阿里云的:
bash
# 华为云镜像(推荐先试这个)
wget https://repo.huaweicloud.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# 或者阿里云镜像(备选)
wget https://mirrors.aliyun.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
验证下载是否成功
下载完成后,用 ls -lh 命令确认文件存在:
bash
ls -lh apache-hive-3.1.3-bin.tar.gz
如果显示 -rw-rw-r-- 1 mumu mumu 365M ... 之类的输出,说明文件下载正常。
文件下载成功!现在开始安装和配置 Hive。
bash
mumu@MuJinqiu:~/downloads$ ls -lh apache-hive-3.1.3-bin.tar.gz
-rw-rw-r-- 1 mumu mumu 312M Apr 9 2022 apache-hive-3.1.3-bin.tar.gz
第一步:解压安装
bash
# 1. 解压到 /usr/local
sudo tar -xzvf apache-hive-3.1.3-bin.tar.gz -C /usr/local/
# 2. 重命名目录
sudo mv /usr/local/apache-hive-3.1.3-bin /usr/local/hive
# 3. 修改权限
sudo chown -R $(whoami):$(whoami) /usr/local/hive
第二步:配置环境变量
bash
# 编辑 .bashrc
vim ~/.bashrc
按 i 进入插入模式,在文件末尾添加:
bash
# Hive Environment Variables
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
按 Esc,输入 :wq 保存退出。
bash
# 使配置生效
source ~/.bashrc
# 验证
hive --version
Hive 安装成功,版本显示正常。SLF4J 警告可以忽略,不影响使用。
bash
mumu@MuJinqiu:~/downloads$ vim ~/.bashrc
mumu@MuJinqiu:~/downloads$ source ~/.bashrc
mumu@MuJinqiu:~/downloads$ hive --version
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive 3.1.3
Git git://MacBook-Pro.fios-router.home/Users/ngangam/commit/hive -r 4df4d75bf1e16fe0af75aad0b4179c34c07fc975
Compiled by ngangam on Sun Apr 3 16:58:16 EDT 2022
From source with checksum 5da234766db5dfbe3e92926c9bbab2af
mumu@MuJinqiu:~/downloads$
继续配置 MySQL
MySQL 好像之前安装过,不记得了
第一步:检查 MySQL 是否已安装
bash
# 检查 MySQL 服务状态
sudo service mysql status
MySQL 正在运行。现在需要测试密码登录。
bash
mumu@MuJinqiu:~/downloads$ sudo service mysql status
● mysql.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-05-18 14:23:37 CST; 2 days ago
Process: 666726 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, sta>
Main PID: 666735 (mysqld)
Status: "Server is operational"
Tasks: 40 (limit: 19181)
Memory: 388.3M (peak: 431.8M)
CPU: 5min 48.397s
CGroup: /system.slice/mysql.service
└─666735 /usr/sbin/mysqld
May 18 14:23:37 MuJinqiu systemd[1]: Starting mysql.service - MySQL Community Server...
May 18 14:23:37 MuJinqiu systemd[1]: Started mysql.service - MySQL Community Server.
lines 1-14/14 (END)
mumu@MuJinqiu:~/downloads$
测试 MySQL 登录
bash
# 尝试用密码 123456 登录
mysql -u root -p123456
好像当初没有设置密码
bash
mumu@MuJinqiu:~/downloads$ mysql -u root -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
mumu@MuJinqiu:~/downloads$
明白了!MySQL 使用的是默认的 auth_socket 认证方式,不需要密码。我们需要改用密码认证。
解决方案:设置 root 密码
bash
# 1. 无密码登录 MySQL
sudo mysql
进入 MySQL 后,你会看到提示符变成 mysql>,然后执行:
sql
-- 2. 查看当前认证方式
SELECT user, plugin FROM mysql.user WHERE user='root';
-- 3. 修改 root 密码和认证方式
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
-- 4. 刷新权限
FLUSH PRIVILEGES;
-- 5. 退出
EXIT;
测试新密码
bash
# 现在可以用密码登录了
mysql -u root -p123456 -e "show databases;"
MySQL 密码设置成功。现在验证一下:
bash
mumu@MuJinqiu:~/downloads$ sudo mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.0.45-0ubuntu0.24.04.1 (Ubuntu)
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> -- 2. 查看当前认证方式
mysql> SELECT user, plugin FROM mysql.user WHERE user='root';
+------+-----------------------+
| user | plugin |
+------+-----------------------+
| root | caching_sha2_password |
| root | auth_socket |
+------+-----------------------+
2 rows in set (0.01 sec)
mysql>
mysql> -- 3. 修改 root 密码和认证方式
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> -- 4. 刷新权限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> -- 5. 退出
mysql> EXIT;
Bye
mumu@MuJinqiu:~/downloads$
验证 MySQL 登录
bash
# 测试新密码
mysql -u root -p123456 -e "show databases;"
MySQL 密码设置成功,可以正常登录。
bash
mumu@MuJinqiu:~/downloads$ mysql -u root -p123456 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| A2608 |
| information_schema |
| lee |
| mysql |
| performance_schema |
| sys |
+--------------------+
mumu@MuJinqiu:~/downloads$
现在继续 Hive 配置。
继续 Hive 配置
1. 下载 MySQL JDBC 驱动
bash
cd ~/downloads
# 下载驱动
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.33/mysql-connector-java-8.0.33.jar
# 复制到 Hive lib 目录
cp mysql-connector-java-8.0.33.jar $HIVE_HOME/lib/
# 验证
ls $HIVE_HOME/lib/mysql-connector*.jar
下载失败
MySQL JDBC 驱动下载地址变了,需要用新地址。
MySQL JDBC 驱动下载地址变了,需要用新地址。
bash
mumu@MuJinqiu:~/downloads$ wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.33/mysql-connector-java-8.0.33.jar
--2026-05-20 16:57:17-- https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.33/mysql-connector-java-8.0.33.jar
Resolving repo1.maven.org (repo1.maven.org)... 104.18.18.12, 104.18.19.12, 2606:4700::6812:120c, ...
Connecting to repo1.maven.org (repo1.maven.org)|104.18.18.12|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2026-05-20 16:57:17 ERROR 404: Not Found.
解决方案:下载正确的 JDBC 驱动
方法一:使用新地址下载(推荐)
bash
cd ~/downloads
# 使用新的 groupId 地址下载
wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
# 复制到 Hive lib 目录
cp mysql-connector-j-8.0.33.jar $HIVE_HOME/lib/
# 验证
ls $HIVE_HOME/lib/mysql-connector*.jar
为什么之前的地址失效了?
MySQL 官方将驱动包的 Maven 坐标从 mysql:mysql-connector-java 迁移到了 com.mysql:mysql-connector-j。所以 JAR 文件的下载路径也变了,需要在新路径下获取。
JDBC 驱动下载成功。现在复制到 Hive lib 目录并继续配置。
bash
mumu@MuJinqiu:~/downloads$ wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
--2026-05-20 17:00:09-- https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
Resolving repo1.maven.org (repo1.maven.org)... 104.18.18.12, 104.18.19.12, 2606:4700::6812:120c, ...
Connecting to repo1.maven.org (repo1.maven.org)|104.18.18.12|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2481560 (2.4M) [application/java-archive]
Saving to: 'mysql-connector-j-8.0.33.jar'
mysql-connector-j-8.0. 100%[============================>] 2.37M 436KB/s in 5.6s
2026-05-20 17:00:15 (430 KB/s) - 'mysql-connector-j-8.0.33.jar' saved [2481560/2481560]
mumu@MuJinqiu:~/downloads$
复制驱动到 Hive
bash
# 复制驱动文件
cp mysql-connector-j-8.0.33.jar $HIVE_HOME/lib/
# 验证
ls $HIVE_HOME/lib/mysql-connector*.jar
配置 hive-site.xml
bash
cd $HIVE_HOME/conf
# 编辑配置文件
vim hive-site.xml
操作步骤:
-
按
i进入插入模式 -
输入以下内容:
xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- MySQL 数据库连接 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC</value>
</property>
<!-- MySQL JDBC 驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!-- MySQL 用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- MySQL 密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- Hive 数据仓库存储位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- Hive 临时目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<!-- 显示当前数据库 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 显示字段名称 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
</configuration>
-
按
Esc退出插入模式 -
输入
:wq保存退出
初始化 Hive 元数据库
bash
# 先删除可能存在的旧数据库
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
# 初始化
schematool -dbType mysql -initSchema
看到 Initialization completed successfully 表示成功。
驱动已复制,数据库已清理。现在继续初始化。
bash
mumu@MuJinqiu:~/downloads$ cp mysql-connector-j-8.0.33.jar $HIVE_HOME/lib/
mumu@MuJinqiu:~/downloads$ ls $HIVE_HOME/lib/mysql-connector*.jar
/usr/local/hive/lib/mysql-connector-j-8.0.33.jar
mumu@MuJinqiu:~/downloads$ cd $HIVE_HOME/conf
mumu@MuJinqiu:/usr/local/hive/conf$ vim hive-site.xml
mumu@MuJinqiu:/usr/local/hive/conf$ mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
mysql: [Warning] Using a password on the command line interface can be insecure.
mumu@MuJinqiu:/usr/local/hive/conf$
初始化 Hive 元数据库
bash
schematool -dbType mysql -initSchema
等待初始化完成,看到 Initialization completed successfully 表示成功。
Hive 元数据库初始化成功!
bash
Initialization script completed
schemaTool completed
mumu@MuJinqiu:/usr/local/hive/conf$
现在启动 Hive
bash
hive
预期看到
text
hive (default)>
测试 Hive 基本操作
在 hive> 提示符下执行:
sql
-- 1. 查看所有数据库
show databases;
-- 2. 创建数据库
create database mydb;
-- 3. 切换数据库
use mydb;
-- 4. 创建表
create table test(id int);
-- 5. 查看表
show tables;
-- 6. 查看表结构
desc test;
-- 7. 插入数据(测试)
insert into test values(1);
-- 8. 查询数据
select * from test;
-- 9. 退出
exit;
Java 版本兼容性问题
bash
mumu@MuJinqiu:/usr/local/hive/conf$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = fde2b783-74b8-4a19-b87a-ee5f65485748
Exception in thread "main" java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
at org.apache.hadoop.hive.ql.session.SessionState.<init>(SessionState.java:413)
at org.apache.hadoop.hive.ql.session.SessionState.<init>(SessionState.java:389)
at org.apache.hadoop.hive.cli.CliSessionState.<init>(CliSessionState.java:60)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:705)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.hadoop.util.RunJar.run(RunJar.java:328)
at org.apache.hadoop.util.RunJar.main(RunJar.java:241)
mumu@MuJinqiu:/usr/local/hive/conf$
这是 Java 版本兼容性问题。Hive 3.1.3 和 Java 11 不完全兼容,需要配置一个兼容性参数。
方法:设置环境变量(推荐)
bash
# 编辑 .bashrc
vim ~/.bashrc
按 i 进入插入模式,在文件末尾添加:
bash
# Hive Java 11 兼容性
export HADOOP_OPTS="--add-modules java.xml.bind"
按 Esc,输入 :wq 保存退出。
bash
# 使配置生效
source ~/.bashrc
# 重新启动 Hive
hive
Java 11 移除了 java.xml.bind 模块。需要改用 Java 8 或者使用不同的解决方案。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ vim ~/.bashrc
mumu@MuJinqiu:/usr/local/hive/conf$ source ~/.bashrc
mumu@MuJinqiu:/usr/local/hive/conf$ hive
Unable to determine Hadoop version information.
'hadoop version' returned:
Error occurred during initialization of boot layer java.lang.module.FindException: Module java.xml.bind not found
mumu@MuJinqiu:/usr/local/hive/conf$
Java 11 移除了 java.xml.bind 模块。需要改用 Java 8 或者使用不同的解决方案。
解决方案:切换到 Java 8(推荐)
bash
# 1. 安装 Java 8
sudo apt update
sudo apt install -y openjdk-8-jdk
# 2. 切换 Java 版本
sudo update-alternatives --config java
# 选择 Java 8(通常选择 /usr/lib/jvm/java-8-openjdk-amd64/bin/java)
# 3. 更新 JAVA_HOME
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> ~/.bashrc
source ~/.bashrc
# 4. 验证
java -version
# 应该显示 openjdk version "1.8.0_xxx"
# 5. 重启 Hadoop(因为 Java 版本变了)
stop-all.sh
start-all.sh
# 6. 重新初始化 Hive 元数据库
schematool -dbType mysql -initSchema
# 7. 启动 Hive
hive
如果使用Java 8,会不会跟Hadoop不兼容?
不用担心,Hadoop 3.3.6 官方完全兼容 Java 8,这反而是最稳定的组合,不会出问题。
官方兼容性说明
| Hadoop 版本 | Java 版本支持 | 推荐场景 |
|---|---|---|
| 3.3.6 | Java 8 / 11 / 17 | Java 8 最稳定,生产首选 |
| 3.2.x | Java 8 | 生产通用 |
| 2.x | Java 7/8 | 已过时,不建议使用 |
关键信息
-
官方推荐 Java 8
虽然 Hadoop 3.3.6 支持 Java 8/11/17,但在生产环境中,Java 8 是最稳妥的选择,社区支持最好,教程也最丰富。
-
Hadoop 3.3.6 最低要求 Java 8
官方文档明确指出:最低要求 JDK 8u161+,推荐 JDK 11 或 17 LTS,但完全不支持 JDK 7。 所以你用 Java 8 完全符合官方要求。
-
你的问题根源是 Java 11
你遇到的
Module java.xml.bind not found错误,正是因为 Java 11 移除了 JAXB 模块 ,而 Hive 3.1.3 依赖这个模块。这个问题在 Java 8 上不存在。
结论:使用 Java 8 是最佳选择
| 对比项 | Java 8 | Java 11 |
|---|---|---|
| Hadoop 3.3.6 兼容性 | ✅ 官方推荐 | ✅ 支持但有兼容问题 |
| Hive 3.1.3 兼容性 | ✅ 完美 | ❌ 需要额外配置 |
| 课堂环境一致性 | ✅ 教室用的就是 Java 8 | ❌ 不同 |
| 社区支持 | ✅ 最丰富 | ⚠️ 较少 |
| 稳定性 | ✅ 生产级 | ⚠️ 需调试 |
简单说:用 Java 8 你遇到的这些问题都不会出现。
现在切换到 Java 8
bash
# 1. 安装 Java 8(如果还没装)
sudo apt update
sudo apt install -y openjdk-8-jdk
# 2. 设置 Java 8 为默认
sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
# 3. 更新环境变量
sed -i 's|JAVA_HOME=.*|JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64|' ~/.bashrc
source ~/.bashrc
# 4. 验证
java -version
# 应该显示 openjdk version "1.8.0_xxx"
# 5. 重启 Hadoop
stop-all.sh
start-all.sh
# 6. 重新启动 Hive
hive
设置 Java 8 为默认时报错
bash
mumu@MuJinqiu:/usr/local/hive/conf$ sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
update-alternatives: error: alternative /usr/lib/jvm/java-8-openjdk-amd64/bin/java for java not registered; not setting
mumu@MuJinqiu:/usr/local/hive/conf$
需要先把 Java 8 注册到 alternatives 系统中
注册 Java 8 并切换
bash
# 1. 注册 Java 8
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1
# 2. 注册 javac(可选)
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 1
# 3. 现在切换
sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
# 4. 验证
java -version
Java 8 切换成功。现在重启 Hadoop 和 Hive。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1
mumu@MuJinqiu:/usr/local/hive/conf$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 1
mumu@MuJinqiu:/usr/local/hive/conf$ sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/java to provide /usr/bin/java (java) in manual mode
mumu@MuJinqiu:/usr/local/hive/conf$ java -version
openjdk version "1.8.0_482"
OpenJDK Runtime Environment (build 1.8.0_482-8u482-ga~us1-0ubuntu1~24.04-b08)
OpenJDK 64-Bit Server VM (build 25.482-b08, mixed mode)
mumu@MuJinqiu:/usr/local/hive/conf$
重启 Hadoop
bash
# 停止 Hadoop
stop-all.sh
# 启动 Hadoop
start-all.sh
# 等待 30 秒
sleep 30
# 验证进程
jps
重新初始化 Hive(可选,为了确保兼容性)
bash
# 删除旧元数据
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
# 重新初始化
schematool -dbType mysql -initSchema
启动 Hive
bash
hive
如果 Hive 启动成功,你会看到
text
hive (default)>
测试 Hive
sql
-- 查看数据库
show databases;
-- 创建测试表
create table test(id int);
-- 查看表
show tables;
-- 退出
exit;
停止 Hadoop 报错
bash
mumu@MuJinqiu:/usr/local/hive/conf$ java -version
openjdk version "1.8.0_482"
OpenJDK Runtime Environment (build 1.8.0_482-8u482-ga~us1-0ubuntu1~24.04-b08)
OpenJDK 64-Bit Server VM (build 25.482-b08, mixed mode)
mumu@MuJinqiu:/usr/local/hive/conf$ ^C
mumu@MuJinqiu:/usr/local/hive/conf$ stop-all.sh
WARNING: Stopping all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: Use CTRL-C to abort.
Stopping namenodes on [Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found]
java.lang.module.FindException:: ssh: Could not resolve hostname java.lang.module.FindException:: Name or service not known
java.xml.bind: ssh: Could not resolve hostname java.xml.bind: Name or service not known
layer: ssh: Could not resolve hostname layer: Temporary failure in name resolution
Error: ssh: Could not resolve hostname error: Temporary failure in name resolution
occurred: ssh: Could not resolve hostname occurred: Temporary failure in name resolution
Module: ssh: Could not resolve hostname module: Temporary failure in name resolution
initialization: ssh: Could not resolve hostname initialization: Temporary failure in name resolution
boot: ssh: Could not resolve hostname boot: Temporary failure in name resolution
of: ssh: Could not resolve hostname of: Temporary failure in name resolution
during: ssh: Could not resolve hostname during: Temporary failure in name resolution
found: ssh: Could not resolve hostname found: Temporary failure in name resolution
not: ssh: Could not resolve hostname not: Temporary failure in name resolution
Stopping datanodes
Stopping secondary namenodes [Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found]
java.lang.module.FindException:: ssh: Could not resolve hostname java.lang.module.FindException:: Name or service not known
java.xml.bind: ssh: Could not resolve hostname java.xml.bind: Name or service not known
occurred: ssh: Could not resolve hostname occurred: Temporary failure in name resolution
initialization: ssh: Could not resolve hostname initialization: Temporary failure in name resolution
Module: ssh: Could not resolve hostname module: Temporary failure in name resolution
layer: ssh: Could not resolve hostname layer: Temporary failure in name resolution
of: ssh: Could not resolve hostname of: Temporary failure in name resolution
during: ssh: Could not resolve hostname during: Temporary failure in name resolution
Error: ssh: Could not resolve hostname error: Temporary failure in name resolution
boot: ssh: Could not resolve hostname boot: Temporary failure in name resolution
found: ssh: Could not resolve hostname found: Temporary failure in name resolution
not: ssh: Could not resolve hostname not: Temporary failure in name resolution
Stopping journal nodes [Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found]
java.lang.module.FindException:: ssh: Could not resolve hostname java.lang.module.FindException:: Name or service not known
java.xml.bind: ssh: Could not resolve hostname java.xml.bind: Name or service not known
occurred: ssh: Could not resolve hostname occurred: Temporary failure in name resolution
Module: ssh: Could not resolve hostname module: Temporary failure in name resolution
layer: ssh: Could not resolve hostname layer: Temporary failure in name resolution
boot: ssh: Could not resolve hostname boot: Temporary failure in name resolution
Error: ssh: Could not resolve hostname error: Temporary failure in name resolution
initialization: ssh: Could not resolve hostname initialization: Temporary failure in name resolution
during: ssh: Could not resolve hostname during: Temporary failure in name resolution
of: ssh: Could not resolve hostname of: Temporary failure in name resolution
found: ssh: Could not resolve hostname found: Temporary failure in name resolution
not: ssh: Could not resolve hostname not: Temporary failure in name resolution
Stopping nodemanagers
Stopping resourcemanagers on [ Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found]
java.lang.module.FindException:: ssh: Could not resolve hostname java.lang.module.FindException:: Name or service not known
java.xml.bind: ssh: Could not resolve hostname java.xml.bind: Name or service not known
of: ssh: Could not resolve hostname of: Temporary failure in name resolution
occurred: ssh: Could not resolve hostname occurred: Temporary failure in name resolution
boot: ssh: Could not resolve hostname boot: Temporary failure in name resolution
Error: ssh: Could not resolve hostname error: Temporary failure in name resolution
during: ssh: Could not resolve hostname during: Temporary failure in name resolution
Module: ssh: Could not resolve hostname module: Temporary failure in name resolution
layer: ssh: Could not resolve hostname layer: Temporary failure in name resolution
initialization: ssh: Could not resolve hostname initialization: Temporary failure in name resolution
java.lang.module.FindException:: ssh: Could not resolve hostname java.lang.module.FindException:: Name or service not known
not: ssh: Could not resolve hostname not: Temporary failure in name resolution
occurred: ssh: Could not resolve hostname occurred: Temporary failure in name resolution
layer: ssh: Could not resolve hostname layer: Temporary failure in name resolution
during: ssh: Could not resolve hostname during: Temporary failure in name resolution
initialization: ssh: Could not resolve hostname initialization: Temporary failure in name resolution
Error: ssh: Could not resolve hostname error: Temporary failure in name resolution
of: ssh: Could not resolve hostname of: Temporary failure in name resolution
found: ssh: Could not resolve hostname found: Temporary failure in name resolution
boot: ssh: Could not resolve hostname boot: Temporary failure in name resolution
java.xml.bind: ssh: Could not resolve hostname java.xml.bind: Name or service not known
occurred: ssh: Could not resolve hostname occurred: Temporary failure in name resolution
boot: ssh: Could not resolve hostname boot: Temporary failure in name resolution
Error: ssh: Could not resolve hostname error: Temporary failure in name resolution
found: ssh: Could not resolve hostname found: Temporary failure in name resolution
Module: ssh: Could not resolve hostname module: Temporary failure in name resolution
not: ssh: Could not resolve hostname not: Temporary failure in name resolution
during: ssh: Could not resolve hostname during: Temporary failure in name resolution
initialization: ssh: Could not resolve hostname initialization: Temporary failure in name resolution
of: ssh: Could not resolve hostname of: Temporary failure in name resolution
java.lang.module.FindException:: ssh: Could not resolve hostname java.lang.module.FindException:: Name or service not known
java.xml.bind: ssh: Could not resolve hostname java.xml.bind: Name or service not known
问题出在 stop-all.sh 脚本仍然使用了 Java 11 的环境变量。需要清理 HDFS 临时文件并确保所有配置都指向 Java 8。
立即解决:清理并重启
1. 杀掉所有 Hadoop 进程
bash
# 强制杀掉所有 Java 进程
pkill -f hadoop
pkill -f namenode
pkill -f datanode
pkill -f resourcemanager
pkill -f nodemanager
# 清理临时文件
rm -rf /home/mumu/hadoop_tmp/dfs/name/*
rm -rf /home/mumu/hadoop_tmp/dfs/data/*
# 清理 Hive 临时文件
rm -rf /tmp/hive*
2. 确保 Java 8 是唯一的 Java
bash
# 检查 Java 路径
which java
# 应该显示 /usr/bin/java
# 检查符号链接
ls -la /usr/bin/java
# 应该指向 /usr/lib/jvm/java-8-openjdk-amd64/bin/java
# 查看当前 Java 版本
java -version
3. 重新格式化 NameNode
bash
# 格式化
hdfs namenode -format
# 输入 Y 确认
4. 启动 Hadoop
bash
start-all.sh
sleep 30
jps
5. 重新初始化 Hive
bash
# 删除旧元数据
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
# 重新初始化
schematool -dbType mysql -initSchema
# 启动 Hive
hive
如果还是不行,修改 Hadoop 启动脚本
bash
# 编辑 hadoop-env.sh
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
找到 export JAVA_HOME 这一行,确保是:
bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
同样检查 yarn-env.sh:
bash
vim $HADOOP_HOME/etc/hadoop/yarn-env.sh
添加或修改:
bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
一键修复脚本
bash
# 1. 清理进程
pkill -f hadoop
pkill -f namenode
pkill -f datanode
# 2. 清理临时文件
rm -rf /home/mumu/hadoop_tmp/dfs/name/*
rm -rf /home/mumu/hadoop_tmp/dfs/data/*
rm -rf /tmp/hive*
# 3. 确保 Java 8 配置
sed -i 's|export JAVA_HOME=.*|export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64|' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> $HADOOP_HOME/etc/hadoop/yarn-env.sh
# 4. 重新格式化
hdfs namenode -format <<< "Y"
# 5. 启动
start-all.sh
sleep 30
# 6. 验证
jps
# 7. 初始化 Hive
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
schematool -dbType mysql -initSchema
看到问题了!--add-modules 参数与 Java 8 不兼容。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 强制杀掉所有 Java 进程
pkill -f hadoop
pkill -f namenode
pkill -f datanode
pkill -f resourcemanager
pkill -f nodemanager
# 清理临时文件
rm -rf /home/mumu/hadoop_tmp/dfs/name/*
rm -rf /home/mumu/hadoop_tmp/dfs/data/*
# 清理 Hive 临时文件
rm -rf /tmp/hive*
mumu@MuJinqiu:/usr/local/hive/conf$
mumu@MuJinqiu:/usr/local/hive/conf$ # 1. 清理进程
pkill -f hadoop
pkill -f namenode
pkill -f datanode
# 2. 清理临时文件
rm -rf /home/mumu/hadoop_tmp/dfs/name/*
rm -rf /home/mumu/hadoop_tmp/dfs/data/*
rm -rf /tmp/hive*
# 3. 确保 Java 8 配置
sed -i 's|export JAVA_HOME=.*|export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64|' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> $HADOOP_HOME/etc/hadoop/yarn-env.sh
# 4. 重新格式化
hdfs namenode -format <<< "Y"
# 5. 启动
start-all.sh
sleep 30
# 6. 验证
jps
# 7. 初始化 Hive
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
schematool -dbType mysql -initSchema
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
WARNING: Attempting to start all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [MuJinqiu]
Starting datanodes
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Starting resourcemanagers on []
Starting nodemanagers
1186690 ResourceManager
1187029 NodeManager
1186421 DataNode
1187375 Jps
mysql: [Warning] Using a password on the command line interface can be insecure.
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
mumu@MuJinqiu:/usr/local/hive/conf$
看到问题了!--add-modules 参数与 Java 8 不兼容。需要移除这个参数。
解决方案:移除 Java 11 的参数设置
1. 从 .bashrc 中移除 Java 11 参数
bash
# 编辑 .bashrc
vim ~/.bashrc
找到并删除这些行(如果存在):
bash
export HADOOP_OPTS="--add-modules java.xml.bind"
export HADOOP_CLIENT_OPTS="--add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED"
按 Esc,输入 :wq 保存退出。
bash
# 重新加载
source ~/.bashrc
2. 检查并清理其他配置文件
bash
# 清理 hadoop-env.sh
grep -n "add-modules" $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 如果找到,删除对应行
# 清理 yarn-env.sh
grep -n "add-modules" $HADOOP_HOME/etc/hadoop/yarn-env.sh
# 清理 hive-env.sh
grep -n "add-modules" $HIVE_HOME/conf/hive-env.sh
3. 快速清理所有 --add-modules
bash
# 从所有配置文件中删除 --add-modules
sed -i '/--add-modules/d' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
sed -i '/--add-modules/d' $HADOOP_HOME/etc/hadoop/yarn-env.sh
sed -i '/--add-modules/d' $HIVE_HOME/conf/hive-env.sh 2>/dev/null
# 验证
grep -r "add-modules" $HADOOP_HOME/etc/hadoop/
4. 重启 Hadoop
bash
# 停止所有
stop-all.sh
# 格式化(输入 Y)
hdfs namenode -format
# 启动
start-all.sh
# 等待 30 秒
sleep 30
# 验证
jps
5. 重新初始化 Hive
bash
# 删除旧元数据
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
# 初始化
schematool -dbType mysql -initSchema
# 启动 Hive
hive
一键修复命令
bash
# 1. 清理配置文件中的 --add-modules
sed -i '/--add-modules/d' ~/.bashrc
sed -i '/--add-modules/d' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
sed -i '/--add-modules/d' $HADOOP_HOME/etc/hadoop/yarn-env.sh
sed -i '/--add-modules/d' $HIVE_HOME/conf/hive-env.sh 2>/dev/null
# 2. 重新加载环境
source ~/.bashrc
# 3. 重启 Hadoop
stop-all.sh
hdfs namenode -format <<< "Y"
start-all.sh
sleep 30
# 4. 验证
jps
# 5. 初始化 Hive
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
schematool -dbType mysql -initSchema
# 6. 启动 Hive
hive
--add-modules 参数还在环境变量中。需要找到并删除所有来源。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 1. 清理配置文件中的 --add-modules
sed -i '/--add-modules/d' ~/.bashrc
sed -i '/--add-modules/d' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
sed -i '/--add-modules/d' $HADOOP_HOME/etc/hadoop/yarn-env.sh
sed -i '/--add-modules/d' $HIVE_HOME/conf/hive-env.sh 2>/dev/null
# 2. 重新加载环境
source ~/.bashrc
# 3. 重启 Hadoop
stop-all.sh
hdfs namenode -format <<< "Y"
start-all.sh
sleep 30
# 4. 验证
jps
# 5. 初始化 Hive
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
schematool -dbType mysql -initSchema
# 6. 启动 Hive
hive
WARNING: Stopping all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: Use CTRL-C to abort.
Stopping namenodes on [MuJinqiu]
Stopping datanodes
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Stopping nodemanagers
Stopping resourcemanagers on []
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
WARNING: Attempting to start all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [MuJinqiu]
Starting datanodes
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Starting resourcemanagers on []
Starting nodemanagers
1189280 DataNode
1189547 ResourceManager
1190233 Jps
1189887 NodeManager
mysql: [Warning] Using a password on the command line interface can be insecure.
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Unable to determine Hadoop version information.
'hadoop version' returned:
Unrecognized option: --add-modules
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
mumu@MuJinqiu:/usr/local/hive/conf$
--add-modules 参数还在环境变量中。需要找到并删除所有来源。
彻底查找并删除 --add-modules
1. 查找所有包含 --add-modules 的文件
bash
# 搜索整个系统(限制在相关目录)
grep -r "add-modules" ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null
grep -r "add-modules" /usr/local/hadoop/etc/hadoop/ 2>/dev/null
grep -r "add-modules" /usr/local/hive/conf/ 2>/dev/null
2. 检查环境变量
bash
# 查看当前环境变量中的 HADOOP_OPTS
echo $HADOOP_OPTS
echo $HADOOP_CLIENT_OPTS
echo $HIVE_OPTS
# 清空这些变量
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
3. 检查 Hadoop 启动脚本
bash
# 查看 hadoop 命令本身是否包含参数
which hadoop
cat /usr/local/hadoop/bin/hadoop | grep -n "add-modules"
看到问题了!echo $HADOOP_OPTS 显示 --add-modules java.xml.bind 仍然存在
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 搜索整个系统(限制在相关目录)
grep -r "add-modules" ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null
grep -r "add-modules" /usr/local/hadoop/etc/hadoop/ 2>/dev/null
grep -r "add-modules" /usr/local/hive/conf/ 2>/dev/null
mumu@MuJinqiu:/usr/local/hive/conf$ # 查看当前环境变量中的 HADOOP_OPTS
echo $HADOOP_OPTS
echo $HADOOP_CLIENT_OPTS
echo $HIVE_OPTS
# 清空这些变量
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
--add-modules java.xml.bind
mumu@MuJinqiu:/usr/local/hive/conf$ # 查看 hadoop 命令本身是否包含参数
which hadoop
cat /usr/local/hadoop/bin/hadoop | grep -n "add-modules"
/usr/local/hadoop/bin/hadoop
mumu@MuJinqiu:/usr/local/hive/conf$
看到问题了!echo $HADOOP_OPTS 显示 --add-modules java.xml.bind 仍然存在,但搜索文件中没有找到,说明它可能被设置在系统级别。
立即解决
1. 直接在终端清空变量并启动
bash
# 清空变量
export HADOOP_OPTS=""
export HADOOP_CLIENT_OPTS=""
export HIVE_OPTS=""
# 验证为空
echo $HADOOP_OPTS
# 启动 Hadoop
start-dfs.sh
start-yarn.sh
# 等待 30 秒
sleep 30
# 查看进程
jps
2. 如果成功,修改启动脚本防止变量重现
bash
# 编辑 start-hadoop.sh
vim ~/bin/start-hadoop.sh
在文件开头(#!/bin/bash 下面)添加:
bash
# 清空 Java 11 兼容性参数(Java 8 不需要)
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
3. 永久解决:查找变量设置的位置
bash
# 搜索所有可能的位置
grep -r "HADOOP_OPTS" ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null
grep -r "HADOOP_OPTS" /etc/profile /etc/environment 2>/dev/null
grep -r "HADOOP_OPTS" /usr/local/hadoop/etc/hadoop/*-env.sh 2>/dev/null
4. 直接在当前终端启动 Hive
bash
# 清空变量后直接启动
unset HADOOP_OPTS
schematool -dbType mysql -initSchema
hive
一键执行(在当前终端)
bash
# 清空所有问题变量
unset HADOOP_OPTS HADOOP_CLIENT_OPTS HIVE_OPTS JAVA_OPTS
# 重启 Hadoop
stop-dfs.sh && stop-yarn.sh
sleep 3
start-dfs.sh && start-yarn.sh
sleep 30
# 验证
jps
# 初始化 Hive
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
schematool -dbType mysql -initSchema
# 启动 Hive
hive
现在执行上面的一键执行命令,把结果发给我!关键是看 hive 能否正常启动。
bash
Starting namenodes on [localhost]
Starting datanodes
localhost: datanode is running as process 1189280. Stop it first and ensure /tmp/hadoop-mumu-datanode.pid file is empty before retry.
Starting secondary namenodes [MuJinqiu]
Starting resourcemanager
resourcemanager is running as process 1189547. Stop it first and ensure /tmp/hadoop-mumu-resourcemanager.pid file is empty before retry.
Starting nodemanagers
localhost: nodemanager is running as process 1189887. Stop it first and ensure /tmp/hadoop-mumu-nodemanager.pid file is empty before retry.
1189280 DataNode
1193511 Jps
1192970 SecondaryNameNode
1189547 ResourceManager
1189887 NodeManager
mumu@MuJinqiu:/usr/local/hive/conf$
Hadoop 已经在运行了。现在直接处理 Hive。
直接初始化并启动 Hive
bash
# 1. 清空 HADOOP_OPTS 变量
unset HADOOP_OPTS
# 2. 删除旧元数据并初始化
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
schematool -dbType mysql -initSchema
# 3. 启动 Hive
hive
如果 schematool 报错
bash
# 查看具体错误
schematool -dbType mysql -initSchema --verbose
如果 hive 命令还是报错
bash
# 直接设置环境变量并启动
unset HADOOP_OPTS
export HADOOP_OPTS=""
hive
创建 Hive 启动脚本(避免变量问题)
bash
# 创建专用脚本
cat > ~/bin/run-hive.sh << 'EOF'
#!/bin/bash
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
export HADOOP_OPTS=""
hive "$@"
EOF
chmod +x ~/bin/run-hive.sh
# 使用脚本启动
run-hive.sh
现在执行
bash
unset HADOOP_OPTS
schematool -dbType mysql -initSchema
把 schematool 的输出结果发给我!
修改启动脚本防止变量重现,这步还没操作
好的,现在来修改启动脚本,防止 --add-modules 变量重现。
修改 start-hadoop.sh 脚本
bash
# 编辑启动脚本
vim ~/bin/start-hadoop.sh
按 i 进入插入模式,在 #!/bin/bash 下面添加清空变量的代码。
完整脚本内容:
bash
#!/bin/bash
# 清空 Java 11 兼容性参数(Java 8 不需要)
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
export HADOOP_OPTS=""
echo "========================================="
echo "Starting Hadoop Cluster"
echo "========================================="
# 启动 SSH 服务
echo "1. Starting SSH service..."
sudo service ssh start
# 启动 Hadoop
echo "2. Starting Hadoop..."
start-all.sh
# 等待服务启动
echo "3. Waiting 30 seconds for services..."
sleep 30
# 显示进程
echo "4. Checking Hadoop processes..."
jps
echo ""
echo "========================================="
echo "✅ Hadoop is ready!"
echo " - HDFS UI: http://localhost:9870"
echo " - YARN UI: http://localhost:8088"
echo "========================================="
按 Esc,输入 :wq 保存退出。
修改 stop-hadoop.sh 脚本(可选)
bash
vim ~/bin/stop-hadoop.sh
bash
#!/bin/bash
# 清空 Java 11 兼容性参数
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
echo "========================================="
echo "Stopping Hadoop Cluster"
echo "========================================="
stop-all.sh
echo ""
echo "✅ Hadoop stopped"
创建 Hive 启动脚本
bash
# 创建 Hive 专用启动脚本
cat > ~/bin/start-hive.sh << 'EOF'
#!/bin/bash
# 清空 Java 11 兼容性参数
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
export HADOOP_OPTS=""
echo "========================================="
echo "Starting Hive"
echo "========================================="
# 确保 Hadoop 已运行
if ! jps | grep -q "NameNode"; then
echo "Hadoop is not running. Please run start-hadoop.sh first"
exit 1
fi
# 启动 Hive CLI
hive
EOF
chmod +x ~/bin/start-hive.sh
验证脚本
bash
# 查看脚本内容
cat ~/bin/start-hadoop.sh
cat ~/bin/start-hive.sh
# 确保有执行权限
ls -la ~/bin/*.sh
现在用新脚本重启
bash
# 停止当前 Hadoop
stop-hadoop.sh
# 用新脚本启动
start-hadoop.sh
# 等待完成后启动 Hive
start-hive.sh
执行完后把 jps 和 hive 启动的结果发给我!
脚本已创建好。现在停止当前服务并用新脚本重启。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 查看脚本内容
cat ~/bin/start-hadoop.sh
cat ~/bin/start-hive.sh
# 确保有执行权限
ls -la ~/bin/*.sh
#!/bin/bash
# 清空 Java 11 兼容性参数(Java 8 不需要)
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
export HADOOP_OPTS=""
echo "========================================="
echo "Starting Hadoop Cluster"
echo "========================================="
# 启动 SSH 服务
echo "1. Starting SSH service..."
sudo service ssh start
# 启动 Hadoop
echo "2. Starting Hadoop..."
start-all.sh
# 等待服务启动
echo "3. Waiting 30 seconds for services..."
sleep 30
# 显示进程
echo "4. Checking Hadoop processes..."
jps
echo ""
echo "========================================="
echo "✅ Hadoop is ready!"
echo " - HDFS UI: http://localhost:9870"
echo " - YARN UI: http://localhost:8088"
echo "========================================="
#!/bin/bash
# 清空 Java 11 兼容性参数
unset HADOOP_OPTS
unset HADOOP_CLIENT_OPTS
unset HIVE_OPTS
export HADOOP_OPTS=""
echo "========================================="
echo "Starting Hive"
echo "========================================="
# 确保 Hadoop 已运行
if ! jps | grep -q "NameNode"; then
echo "Hadoop is not running. Please run start-hadoop.sh first"
exit 1
fi
# 启动 Hive CLI
hive
-rwxrwxr-x 1 mumu mumu 772 May 20 17:38 /home/mumu/bin/start-hadoop.sh
-rwxrwxr-x 1 mumu mumu 415 May 20 17:39 /home/mumu/bin/start-hive.sh
-rwxrwxr-x 1 mumu mumu 267 May 20 17:39 /home/mumu/bin/stop-hadoop.sh
mumu@MuJinqiu:/usr/local/hive/conf$
停止当前 Hadoop 并重新启动
bash
# 停止 Hadoop
stop-hadoop.sh
# 等待几秒
sleep 5
# 用新脚本启动
start-hadoop.sh
在 Hive 启动前先检查变量
bash
# 检查环境变量是否已清空
echo "HADOOP_OPTS = [$HADOOP_OPTS]"
# 应该显示为空
启动 Hive
bash
# 启动 Hive
start-hive.sh
Hadoop 启动成功,没有 --add-modules 错误了
bash
mumu@MuJinqiu:/usr/local/hive/conf$ stop-hadoop.sh
=========================================
Stopping Hadoop Cluster
=========================================
WARNING: Stopping all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: Use CTRL-C to abort.
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [MuJinqiu]
Stopping nodemanagers
Stopping resourcemanager
✅ Hadoop stopped
mumu@MuJinqiu:/usr/local/hive/conf$ start-hadoop.sh
=========================================
Starting Hadoop Cluster
=========================================
1. Starting SSH service...
[sudo] password for mumu:
2. Starting Hadoop...
WARNING: Attempting to start all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [MuJinqiu]
Starting resourcemanager
Starting nodemanagers
3. Waiting 30 seconds for services...
4. Checking Hadoop processes...
1199426 Jps
1198487 SecondaryNameNode
1198293 DataNode
1198713 ResourceManager
1198941 NodeManager
=========================================
✅ Hadoop is ready!
- HDFS UI: http://localhost:9870
- YARN UI: http://localhost:8088
=========================================
mumu@MuJinqiu:/usr/local/hive/conf$
环境变量已经清空。现在可以直接启动 Hive 了。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 检查环境变量是否已清空
echo "HADOOP_OPTS = [$HADOOP_OPTS]"
# 应该显示为空
HADOOP_OPTS = []
mumu@MuJinqiu:/usr/local/hive/conf$
启动 Hive
bash
hive
Hive 无法连接到 HDFS,说明 Hadoop 没有正常运行。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 9c04f94f-71ad-490a-85a0-1d5996be55a5
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Exception in thread "main" java.lang.RuntimeException: java.net.ConnectException: Call From MuJinqiu/127.0.1.1 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:651)
at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:591)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:747)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:328)
at org.apache.hadoop.util.RunJar.main(RunJar.java:241)
Caused by: java.net.ConnectException: Call From MuJinqiu/127.0.1.1 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:930)
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:845)
at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1571)
at org.apache.hadoop.ipc.Client.call(Client.java:1513)
at org.apache.hadoop.ipc.Client.call(Client.java:1410)
at org.apache.hadoop.ipc.ProtobufRpcEngine2$Invoker.invoke(ProtobufRpcEngine2.java:258)
at org.apache.hadoop.ipc.ProtobufRpcEngine2$Invoker.invoke(ProtobufRpcEngine2.java:139)
at com.sun.proxy.$Proxy28.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:966)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:433)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:166)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:158)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:96)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:362)
at com.sun.proxy.$Proxy29.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1739)
at org.apache.hadoop.hdfs.DistributedFileSystem$29.doCall(DistributedFileSystem.java:1829)
at org.apache.hadoop.hdfs.DistributedFileSystem$29.doCall(DistributedFileSystem.java:1826)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1841)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1862)
at org.apache.hadoop.hive.ql.exec.Utilities.ensurePathIsWritable(Utilities.java:4486)
at org.apache.hadoop.hive.ql.session.SessionState.createRootHDFSDir(SessionState.java:760)
at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:701)
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:627)
... 9 more
Caused by: java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:716)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:205)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:600)
at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:652)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:773)
at org.apache.hadoop.ipc.Client$Connection.access$3800(Client.java:347)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1632)
at org.apache.hadoop.ipc.Client.call(Client.java:1457)
... 34 more
mumu@MuJinqiu:/usr/local/hive/conf$
Hive 无法连接到 HDFS,说明 Hadoop 没有正常运行。需要重新启动 Hadoop。
检查 Hadoop 状态
bash
# 查看当前 Java 进程
jps
# 如果看不到 NameNode 等进程,说明 Hadoop 没启动
NameNode 没有运行!这就是 Hive 连接失败的原因。
bash
mumu@MuJinqiu:/usr/local/hive/conf$ jps
1198487 SecondaryNameNode
1198293 DataNode
1198713 ResourceManager
1201471 Jps
1198941 NodeManager
mumu@MuJinqiu:/usr/local/hive/conf$
NameNode 没有运行!这就是 Hive 连接失败的原因。
启动 NameNode
bash
# 启动 HDFS(NameNode 会跟着启动)
start-dfs.sh
# 等待 10 秒
sleep 10
# 再次查看进程
jps
如果 NameNode 还是不启动
bash
# 停止所有服务
stop-all.sh
# 格式化 NameNode(输入 Y)
hdfs namenode -format
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
# 等待 30 秒
sleep 30
# 查看进程
jps
一键修复
bash
# 完整重启
stop-all.sh && \
rm -rf /home/mumu/hadoop_tmp/dfs/name/* /home/mumu/hadoop_tmp/dfs/data/* && \
echo "Y" | hdfs namenode -format && \
start-dfs.sh && \
start-yarn.sh && \
sleep 30 && \
jps
执行后应该看到 5 个进程:NameNode, DataNode, SecondaryNameNode, ResourceManager, NodeManager
把 jps 的结果发给我!
bash
mumu@MuJinqiu:/usr/local/hive/conf$ start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
localhost: datanode is running as process 1198293. Stop it first and ensure /tmp/hadoop-mumu-datanode.pid file is empty before retry.
Starting secondary namenodes [MuJinqiu]
MuJinqiu: secondarynamenode is running as process 1198487. Stop it first and ensure /tmp/hadoop-mumu-secondarynamenode.pid file is empty before retry.
mumu@MuJinqiu:/usr/local/hive/conf$ jps
1202897 Jps
1198487 SecondaryNameNode
1198293 DataNode
1198713 ResourceManager
1198941 NodeManager
mumu@MuJinqiu:/usr/local/hive/conf$
NameNode 仍然没有启动。需要清理 PID 文件并重新启动。
清理 PID 文件并重启
bash
# 1. 停止所有服务
stop-all.sh
# 2. 清理 PID 文件
rm -f /tmp/hadoop-mumu-*.pid
# 3. 清理临时文件
rm -rf /home/mumu/hadoop_tmp/dfs/name/*
rm -rf /home/mumu/hadoop_tmp/dfs/data/*
# 4. 重新格式化 NameNode
hdfs namenode -format
# 5. 启动所有服务
start-all.sh
# 6. 等待 30 秒
sleep 30
# 7. 查看进程
jps
一键执行
bash
stop-all.sh && \
rm -f /tmp/hadoop-mumu-*.pid && \
rm -rf /home/mumu/hadoop_tmp/dfs/name/* /home/mumu/hadoop_tmp/dfs/data/* && \
echo "Y" | hdfs namenode -format && \
start-all.sh && \
sleep 30 && \
jps
如果 NameNode 还是不启动,检查日志
bash
# 查看 NameNode 日志
tail -50 $HADOOP_HOME/logs/*namenode*.log
执行一键命令后,把 jps 的结果发给我!应该看到 NameNode 进程。
bash
SHUTDOWN_MSG: Shutting down NameNode at MuJinqiu/127.0.1.1
************************************************************/
WARNING: Attempting to start all Apache Hadoop daemons as mumu in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [MuJinqiu]
Starting resourcemanager
Starting nodemanagers
1204881 ResourceManager
1205595 Jps
1204440 DataNode
1204270 NameNode
1204655 SecondaryNameNode
1205215 NodeManager
mumu@MuJinqiu:/usr/local/hive/conf$
🎉 完美!NameNode 现在正常启动了!
现在测试 HDFS 并启动 Hive:
测试 HDFS
bash
# 查看 HDFS 根目录
hdfs dfs -ls /
# 创建 Hive 需要的目录
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod 777 /user/hive/warehouse
hdfs dfs -chmod 777 /tmp
启动 Hive
bash
# 清空环境变量
unset HADOOP_OPTS
export HADOOP_OPTS=""
# 启动 Hive
hive
如果 Hive 启动成功,你会看到
text
hive (default)>
然后执行:
sql
-- 测试命令
show databases;
-- 创建测试表
create table test(id int);
-- 查看表
show tables;
-- 退出
exit;
现在执行 hdfs dfs -ls / 和 hive,把结果发给我!
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 查看 HDFS 根目录
hdfs dfs -ls /
# 创建 Hive 需要的目录
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod 777 /user/hive/warehouse
hdfs dfs -chmod 777 /tmp
chmod: `/tmp': No such file or directory
mumu@MuJinqiu:/usr/local/hive/conf$
mumu@MuJinqiu:/usr/local/hive/conf$
/tmp 目录不存在,需要先创建它。
创建 /tmp 目录并设置权限
bash
# 创建 /tmp 目录
hdfs dfs -mkdir -p /tmp
# 设置权限
hdfs dfs -chmod 777 /tmp
# 验证
hdfs dfs -ls /
然后创建 Hive 需要的目录
bash
# 创建 warehouse 目录
hdfs dfs -mkdir -p /user/hive/warehouse
# 设置权限
hdfs dfs -chmod 777 /user/hive/warehouse
# 验证
hdfs dfs -ls /user/hive/
启动 Hive
bash
# 清空环境变量
unset HADOOP_OPTS
export HADOOP_OPTS=""
# 启动 Hive
hive
一键执行
bash
# 创建所有必要目录
hdfs dfs -mkdir -p /tmp /user/hive/warehouse && \
hdfs dfs -chmod 777 /tmp /user/hive/warehouse && \
hdfs dfs -ls / && \
unset HADOOP_OPTS && \
hive
执行后把 hive 的启动结果发给我!
恭喜!Hive 启动成功!
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 创建所有必要目录
hdfs dfs -mkdir -p /tmp /user/hive/warehouse && \
hdfs dfs -chmod 777 /tmp /user/hive/warehouse && \
hdfs dfs -ls / && \
unset HADOOP_OPTS && \
hive
Found 2 items
drwxrwxrwx - mumu supergroup 0 2026-05-20 17:56 /tmp
drwxr-xr-x - mumu supergroup 0 2026-05-20 17:55 /user
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 076eae9f-4683-4b06-a018-2f998dc106ec
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)>
🎉 恭喜!Hive 启动成功!
现在你可以在 hive (default)> 提示符下执行 SQL 了。
基础测试命令
在 hive (default)> 提示符下执行:
sql
-- 1. 查看所有数据库
show databases;
-- 2. 创建测试数据库
create database mydb;
-- 3. 切换到新数据库
use mydb;
-- 4. 创建测试表
create table t_test(id int, name string);
-- 5. 查看所有表
show tables;
-- 6. 查看表结构
desc t_test;
-- 7. 插入测试数据
insert into t_test values(1, 'zhangsan');
-- 8. 查询数据
select * from t_test;
-- 9. 退出 Hive
exit;
按照课堂笔记练习
创建 t_score 表
sql
create table t_score(
sno int,
sname string,
class string,
score float
)
row format delimited fields terminated by '-';
导入数据
在另一个终端(或退出 Hive 后)创建数据文件:
bash
# 创建数据文件
cat > ~/score.txt << 'EOF'
101-zhangsan-yuwen-90
102-lisi-shuxue-85
103-wangwu-yingyu-88
EOF
# 上传到 HDFS
hdfs dfs -put ~/score.txt /user/mumu/
回到 Hive:
sql
-- 加载数据
load data inpath '/user/mumu/score.txt' into table t_score;
-- 查询
select * from t_score;
重要提示
| 项目 | 说明 |
|---|---|
| SLF4J 警告 | 可以忽略,不影响使用 |
| Hive-on-MR 警告 | 表示使用 MapReduce 作为执行引擎,正常现象 |
| 退出 Hive | 输入 exit; 或按 Ctrl+C |
现在你可以按照课堂笔记开始练习 Hive SQL 了!
没看到 hive (default)> 提示符
bash
mumu@MuJinqiu:/usr/local/hive/conf$ # 创建所有必要目录
hdfs dfs -mkdir -p /tmp /user/hive/warehouse && \
hdfs dfs -chmod 777 /tmp /user/hive/warehouse && \
hdfs dfs -ls / && \
unset HADOOP_OPTS && \
hive
Found 2 items
drwxrwxrwx - mumu supergroup 0 2026-05-20 17:56 /tmp
drwxr-xr-x - mumu supergroup 0 2026-05-20 17:55 /user
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 076eae9f-4683-4b06-a018-2f998dc106ec
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)> mumu@MuJinqiu:/usr/local/hive/conf$
mumu@MuJinqiu:/usr/local/hive/conf$
mumu@MuJinqiu:/usr/local/hive/conf$
mumu@MuJinqiu:/usr/local/hive/conf$
mumu@MuJinqiu:/usr/local/hive/conf$
你已经在 Hive 中了,只是提示符被覆盖了。试试按一下回车,应该会出现 hive (default)>。
检查是否在 Hive 中
bash
# 输入一个简单命令,看看是否有输出
show databases;
如果显示 OK 和数据库列表,说明已经在 Hive 中。
如果没反应,重新进入 Hive
bash
# 退出当前 Hive(按 Ctrl+C 或输入 exit;)
# 重新启动 Hive
unset HADOOP_OPTS
hive
预期看到
text
hive (default)>
然后在提示符下输入 SQL。
需要先回到家目录再启动hive吗
不需要回到家目录,在任何目录都可以启动 Hive。
启动 Hive 的正确方式
bash
# 在任何目录都可以,包括当前目录
hive
元数据存储问题。需要检查 MySQL 连接和 Hive 元数据配置。
bash
hive (default)> show databases;
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
hive (default)>
这是元数据存储问题。需要检查 MySQL 连接和 Hive 元数据配置。
诊断步骤
1. 检查 MySQL 是否正常运行
bash
# 在另一个终端(或退出 Hive 后)执行
sudo service mysql status
# 测试 MySQL 连接
mysql -u root -p123456 -e "show databases;"
2. 检查 metastore 数据库是否存在
bash
mysql -u root -p123456 -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'metastore';"
3. 检查 Hive 元数据表是否存在
bash
mysql -u root -p123456 -e "USE metastore; SHOW TABLES;" 2>/dev/null | head -10
解决方案:重新初始化 Hive 元数据
bash
# 1. 退出 Hive(如果还在)
exit;
# 2. 删除旧的 metastore 数据库
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;"
# 3. 重新初始化
schematool -dbType mysql -initSchema
# 4. 清空环境变量
unset HADOOP_OPTS
# 5. 重新启动 Hive
hive
如果 schematool 报错
bash
# 查看详细错误
schematool -dbType mysql -initSchema --verbose
# 或者检查 JDBC 驱动
ls -la $HIVE_HOME/lib/mysql-connector*.jar
一键修复
bash
# 完整重置
mysql -u root -p123456 -e "DROP DATABASE IF EXISTS metastore;" && \
schematool -dbType mysql -initSchema && \
unset HADOOP_OPTS && \
hive
执行一键修复命令,把输出结果发给我!
现在你可以正常使用 Hive 了
bash
Initialization script completed
schemaTool completed
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 9b8d20d4-eef2-478e-ade7-8ab9d7fc8935
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = e8d6bfb8-9d2a-4aff-a248-cb2aac2b6f85
hive (default)>
🎉 完美!Hive 已经成功启动了!
现在你可以正常使用 Hive 了。在 hive (default)> 提示符下执行命令:
测试基础命令
sql
-- 1. 查看所有数据库
show databases;
-- 2. 创建数据库
create database mydb;
-- 3. 使用数据库
use mydb;
-- 4. 创建表
create table test(id int, name string);
-- 5. 查看表
show tables;
-- 6. 插入数据
insert into test values(1, 'hello');
-- 7. 查询数据
select * from test;
bash
> show databases;
OK
database_name
default
Time taken: 0.277 seconds, Fetched: 1 row(s)
hive (default)>
按照课堂笔记练习
创建 t_score 表
sql
create table t_score(
sno int,
sname string,
class string,
score float
)
row format delimited fields terminated by '-';
导入数据文件
在另一个 WSL 终端窗口执行:
bash
# 创建数据文件
cat > ~/score.txt << 'EOF'
101-zhangsan-yuwen-90
102-lisi-shuxue-85
103-wangwu-yingyu-88
EOF
# 上传到 HDFS
hdfs dfs -mkdir -p /user/mumu
hdfs dfs -put ~/score.txt /user/mumu/
回到 Hive 执行:
sql
-- 加载数据
load data inpath '/user/mumu/score.txt' into table t_score;
-- 查询验证
select * from t_score;
退出 Hive
sql
exit;
现在在 hive (default)> 提示符下输入 show databases; 试试!