hadoop 升级 jdk11

版本信息

jdk11
hadoop-3.4.0-arm
hive4.0

遇到的问题

1. java.lang.NoSuchMethodError: java.nio.ByteBuffer.position(I)Ljava/nio/ByteBuffer

使用的 jdk8 没有这个,升级到 jdk11

2. hive 使用jdk11 启动错误

提示
Exception in thread"main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader

  1. 使用 hive4.0 及以上版本

  2. hive3.x 修改 hive 的 jdk

hive 可能是读取的 Hadoop 里面 的 信息,手动修改环境变量还是 使用的 jdk11

jdk 的信息, 环境变量 /opt/bigdata/java/current

1
2
3
4
5
6
7
[root@test-63 java]# pwd
/opt/bigdata/java
[root@test-63 java]# ls -l
total 8
lrwxrwxrwx 1 root root 30 Jun 5 10:41 current -> /opt/bigdata/java/jdk-11.0.23
drwxr-xr-x 8 10143 10143 4096 Dec 16 2021 jdk1.8.0_321
drwxr-xr-x 8 root root 4096 Jun 5 10:19 jdk-11.0.23

修改 hive 文件 /opt/bigdata/hive/current/bin/hive

默认指向 /opt/bigdata/java/jdk-11.0.23 使用 hive 后指向 /opt/bigdata/java/jdk1.8.0_321

新加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
if [ -z "$HIVE_JAVA_SWITCHED" ]; then
# 保存当前的软连接目标
CURRENT_JAVA=/opt/bigdata/java/jdk-11.0.23

# 创建指向 java2 的软连接
ln -sfn /opt/bigdata/java/jdk1.8.0_321 /opt/bigdata/java/current

# 检查软连接是否成功更新
if [ "$(readlink -f /opt/bigdata/java/current)" != "/opt/bigdata/java/jdk1.8.0_321" ]; then
echo "Failed to update the Java soft link to java2"
exit 1
fi

# 设置 JAVA_HOME 和 PATH
export JAVA_HOME=/opt/bigdata/java/current
export PATH=$JAVA_HOME/bin:$PATH
export HIVE_HOME=/opt/bigdata/hive/current
# 标记已切换 Java 版本,防止递归
export HIVE_JAVA_SWITCHED=true

# 定义恢复函数
function restore_java {
ln -sfn /opt/bigdata/java/jdk-11.0.23 /opt/bigdata/java/current

if [ "$(readlink -f /opt/bigdata/java/current)" != "/opt/bigdata/java/jdk-11.0.23" ]; then
echo "Failed to restore the Java soft link to the original version"
exit 1
fi
}

# 捕捉各种退出信号以便恢复 Java 软链接
trap restore_java EXIT HUP INT TERM

# 启动 Hive 并捕获其退出状态
$HIVE_HOME/bin/hive "$@"
HIVE_EXIT_STATUS=$?

# 明确调用恢复函数,恢复软链接
restore_java

# 退出脚本时返回 Hive 的退出状态
exit $HIVE_EXIT_STATUS
fi


# 下面是原有的 Hive 启动脚本内容...