JAVA_HOME未设置

8
在进行伪分布式操作的Hadoop实现时,我遇到了JAVA_HOME变量未设置的异常,但当我尝试回显它时,它已经被设置。该变量预设在conf/hadoop-env.sh(编辑export JAVA_HOME=/usr/lib/jvm/java-6-sun)和bash.bashrc中。
vardan@vardan-HP-G62-Notebook-PC:~/hadoop-0.20.203.0$ echo $JAVA_HOME
/usr/lib/jvm/java-6-sun
vardan@vardan-HP-G62-Notebook-PC:~/hadoop-0.20.203.0$ bin/start-all.sh
starting namenode, logging to /home/vardan/hadoop-0.20.203.0/bin/../logs/hadoop-vardan-namenode-vardan-HP-G62-Notebook-PC.out
localhost: starting datanode, logging to /home/vardan/hadoop-0.20.203.0/bin/../logs/hadoop-vardan-datanode-vardan-HP-G62-Notebook-PC.out
localhost: Error: JAVA_HOME is not set. 
localhost: starting secondarynamenode, logging to /home/vardan/hadoop-0.20.203.0/bin/../logs/hadoop-vardan-secondarynamenode-vardan-HP-G62-Notebook-PC.out
localhost: Error: JAVA_HOME is not set. 
starting jobtracker, logging to /home/vardan/hadoop-0.20.203.0/bin/../logs/hadoop-vardan-jobtracker-vardan-HP-G62-Notebook-PC.out 
localhost: starting tasktracker, logging to /home/vardan/hadoop-0.20.203.0/bin/../logs/hadoop-vardan-tasktracker-vardan-HP-G62-Notebook-PC.out
localhost: Error: JAVA_HOME is not set.

2
如果问题仍未解决,请在./conf/hadoop-env.sh中添加行。还需添加~/.bashrc中设置JAVA_HOME路径的行。 - devsri
9个回答

4

我只需要在./conf/hadoop-env.sh文件中添加了这一行:

# The java implementation to use.  Required.
export JAVA_HOME=/usr/java/latest

它有助于


还值得注意的是,如果您已经由于某种原因(例如使用Maven)设置了JAVA_HOME,则不能忽略它。仍然需要定义JAVA_HOME导出变量(而不仅仅是使用export JAVA_HOME=$JAVA_HOME,而是一个正确的字符串)。 - tsiki
从Apache下载的tarball上使用Hadoop 1.0.4。在Ubuntu 12.04上使用Open JDK 6 -(ubuntu将java二进制文件放置在/usr/bin/java中),因此在此文件中,我取消了注释JAVA_HOME变量并将其替换为/usr,并且start-all.sh可以正常工作,没有JAVA_HOME错误。 - Jeremy Hajek
谢谢,这对我也有效。Hadoop版本是2.6.0。 - Binita Bharati

3

您使用set JAVA_HOME=设置的JAVA_HOME变量仅适用于当前shell。鉴于在执行bin/start-all.sh时会启动新的shell,因此您需要“导出”该环境变量以使其在全局范围内可用:

export JAVA_HOME=/usr/lib/jvm/java-6-sun

3

检查一下bin/start-all.sh文件是否覆盖了JAVA_HOME环境变量。

你可以在执行这些二进制文件之前,在该脚本中加入echo $JAVA_HOME命令来确认。


通常启动脚本会以其他用户身份启动守护进程,请确保该用户在 .bashrc 文件中也有适当的导出设置。 - ŁukaszBachman
手动设置Java Home,例如在此处的另一个答案中所示,将其放入bin/start-all.sh:export JAVA_HOME=/usr/lib/jvm/java-6-sun - ilvez

1

安装Java 1.6.x

  1. 下载 "jdk-6u32-linux-i586.bin"
  2. sh jdk-6u32-linux-i586.bin

  3. mv /etc/alternatives/java /etc/alternatives/java_bak mv /etc/alternatives/javac /etc/alternatives/javac_bak

  4. 创建链接 ln -s /opt/jdk1.6.0_32/bin/java /etc/alternatives/java ln -s /opt/jdk1.6.0_32/bin/javac /etc/alternatives/javac

5. java -version

-----------你应该看到这个-------------------------------- java version "1.6.0_32" Java(TM) SE Runtime Environment (build 1.6.0_32-b05)

Java HotSpot(TM) Client VM (build 20.7-b02, mixed mode, sharing)


0
问题在于初始化dfs和mapreduce守护程序的脚本没有在其环境中定义JAVA_HOME。

可能情况是,在执行HDFS和MapReduce时,其执行环境是由脚本$HADOOP_HOME/conf/hadoop-env.sh指定的。因此,在$HADOOP_HOME/conf/hadoop-env.sh中定义JAVA_HOME就足够了:
export JAVA_HOME=jdk-home-path

否则,当这不够用时,问题可能是使用的配置环境(hadoop-env.sh)不是我们期望的环境; Hadoop正在选择另一个环境或默认值(如果找不到)。 最快的解决方案是定义hadoop-env.sh脚本所在的conf目录。设置HADOOP_CONF_DIR环境变量就足够了:
export HADOOP_CONF_DIR=hadoop-home-path/conf

0

也许您需要按照以下步骤检查 $JAVA_HOME 配置:
1. 对于 hadoop-1.x:hadoop-home-path/conf/hadoop-env.sh
2. 对于 hadoop-2.x:hadoop-home-path/etc/hadoop/hadoop-env.sh


0

您可以在.bashrc文件中添加以下内容:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

这样,当您更新软件包并使用Hadoop时,它将动态更改。


0

在Ubuntu Precise + CDH4上遇到了同样的问题...

简而言之,CDH4使用bigtop,设置JAVA_HOME最简单的方法是编辑/etc/default/bigtop-utils文件,例如:

export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_43/jre/

注意:我在正确安装CDH4后找不到任何hadoop-env.sh文件。


0

你可以尝试在你的 .bash_profile 文件中写入 "JAVA_HOME=/usr/lib/jvm/java-6-sun",当你使用控制台登录时,无论是在机器上还是使用 ssh,.bash_profile 都会被执行。而当你执行 /bin/bash 或另一个终端时,.bashrc 就会被打开。

你也可以尝试将它写在 start-all.sh 中。

确保 JAVA_HOME 的路径正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接