Windows 11 WSL Ubuntu 环境:实际安装 Hive 踩坑实录

本文详细记录了在WSL Ubuntu环境下安装配置Hive 3.1.3的全过程。


主要内容包括:

  1. 环境准备,确认Hadoop 3.3.6和Java 8正常运行;

  2. 从华为云镜像下载Hive并配置环境变量;

  3. 解决MySQL认证问题并设置root密码;

  4. 下载新版MySQL JDBC驱动并配置hive-site.xml;

  5. 处理Java版本兼容性问题,最终切换至Java 8;

  6. 通过清理临时文件、重新格式化NameNode等操作解决Hadoop启动问题;

  7. 成功启动Hive并完成基础测试,包括创建数据库、表和导入数据等操作。


整个过程涵盖了多个常见问题的解决方案,为在WSL环境下搭建Hive提供了完整参考。


AI 总结版(更简洁)在这


在 WSL Ubuntu 上安装和使用 Hive


在 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

操作步骤

  1. i 进入插入模式

  2. 输入以下内容:

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&amp;useSSL=false&amp;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>
  1. Esc 退出插入模式

  2. 输入 :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 已过时,不建议使用

关键信息

  1. 官方推荐 Java 8

    虽然 Hadoop 3.3.6 支持 Java 8/11/17,但在生产环境中,Java 8 是最稳妥的选择,社区支持最好,教程也最丰富。

  2. Hadoop 3.3.6 最低要求 Java 8

    官方文档明确指出:最低要求 JDK 8u161+,推荐 JDK 11 或 17 LTS,但完全不支持 JDK 7。 所以你用 Java 8 完全符合官方要求。

  3. 你的问题根源是 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

执行完后把 jpshive 启动的结果发给我!


脚本已创建好。现在停止当前服务并用新脚本重启。

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; 试试!

相关推荐
youngerwang9 小时前
【Windows tcpip协议栈完整静态反汇编分析】
windows·tcpip协议栈·静态反汇编分析
2301_7644413310 小时前
主流手机pc品牌的端侧模型部署梳理
人工智能·windows·机器学习·智能手机·产品运营
Java面试题总结10 小时前
C#12 中的 Using Alias
开发语言·windows·c#
zh路西法11 小时前
【SSH 免密登录全流程】Windows Linux 通用方案
linux·windows·ssh
Linlingu14 小时前
openClaw不能操作我的电脑提示没有权限如何解决?
人工智能·windows·办公自动化·数字员工·小龙虾
会Tk矩阵群控的小木14 小时前
基于Python的iMessage短信群发与社媒多账号统一管理系统实现
开发语言·windows·python·新媒体运营·开源软件·个人开发
曾小蛙15 小时前
【TWIST2】 PICO重映射G1在ubuntu 22.04下环境配置
ubuntu·g1·twist2·gmr2·pico4u·xrobotoolkit
starvapour15 小时前
Ubuntu部署gitlab频繁出现502的问题
linux·ubuntu·gitlab
雾沉川17 小时前
Nano11 25H2 精简版 Windows11 系统介绍与部署实操教程
windows
__Witheart__17 小时前
rk3568 交叉编译链
ubuntu·rockchip