JAVA 环境配置
介绍
熟悉完 SSH 之后,我们来搞清楚系统中的 JAVA。因为很多大数据程序是 Java 的,所以,我们要步步为营,把 Java 先弄清楚了。
问题
在运行大数据程序,比如启动 start-dfs.sh 的时候,可能出现以下问题:
Starting namenodes on [localhost]
localhost: ERROR: JAVA_HOME is not set and could not be found.
这个错误提示表明 JAVA_HOME 环境变量未设置,Hadoop 无法找到 Java 运行时环境。要解决这个问题,你需要设置 JAVA_HOME 环境变量。以下是具体步骤:
找到 Java 安装路径
首先,确定你的 Java 安装路径。可以使用以下命令查看:
which java | sed "s:bin/java::"
假设返回的路径是 /opt/cloudide/jdk/jdk-17.0.10/
。
设置 Hadoop 的 JAVA_HOME 环境变量
对 Hadoop,我们可以编辑 Hadoop 的环境配置文件来设置 JAVA_HOME
编辑 $HADOOP_HOME/etc/hadoop/hadoop-env.sh
文件:
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
在文件中找到 # export JAVA_HOME=...
行,取消注释并设置为你的 Java 安装路径,例如:
export JAVA_HOME=/opt/cloudide/jdk/jdk-17.0.10/
保存并关闭文件。
设置全局 JAVA_HOME
如果你希望全局设置 JAVA_HOME
环境变量,可以编辑 ~/.zshrc
文件:
vi ~/.zshrc
在文件末尾添加以下行:
export JAVA_HOME=/opt/cloudide/jdk/jdk-17.0.10
export PATH=$PATH:$JAVA_HOME/bin
然后保存并关闭文件,加载新的配置:
source ~/.zshrc
验证 JAVA_HOME 环境变量
可以通过以下命令验证 JAVA_HOME
是否设置正确:
echo $JAVA_HOME
应该输出你的 Java 安装路径。
Java 版本兼容性问题
Marscode 上的 Java 是 17。所以运行 Hadoop 时可能出现下面的错误:
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not “opens java.lang” to unnamed module @5f565482
这个错误通常是因为 Java 版本兼容性问题,特别是使用了 Java 9 及以上版本,而 Hadoop 依赖一些内部 API 这些版本中默认被限制访问。
如果你必须使用 Java 9 及以上版本,可以尝试修改 Hadoop 的启动配置,添加 JVM 参数,允许访问受限制的模块。
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
文件,添加以下行:
export HADOOP_OPTS="$HADOOP_OPTS --add-opens=java.base/java.lang=ALL-UNNAMED"
通过这些步骤,你应该能够解决 InaccessibleObjectException
错误。
Index | Previous | Next |