使用Hadoop: localhost出现错误:JAVA_HOME未设置

31

我正在使用Ubuntu 12.04 LTS。

我正在按照hadoop快速入门手册进行伪分布式操作。这看起来非常简单和直接(易!)。

然而,当我尝试运行start-all.sh时,我得到了以下提示:

localhost: Error: JAVA_HOME is not set.

我已经阅读了stackoverflow上的所有关于这个问题的建议,并采取了以下措施来确保JAVA_HOME已设置:

/etc/hadoop/conf/hadoop-env.sh中,我已经设置了:

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

我已经在/etc/bash.bashrc中设置了

JAVA_HOME=/usr/lib/jvm/java-6-oracle
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH

which java 返回:

/usr/bin/java

java -version 命令可以运行。

echo $JAVA_HOME 返回:

/usr/lib/jvm/java-6-oracle

我甚至尝试成为root用户并在终端中明确地写入:

$ JAVA_HOME=/usr/lib/jvm/java-6-oracle
$ export JAVA_HOME
$ start-all.sh

如果你能向我展示如何解决这个错误,我将非常感激。 我认为我的 JAVA_HOME 被某种方式覆盖了。如果是这样的话,你能否向我解释如何使我的导出全局化?


当您更改bashrc文件时,需要重置终端。 - arutaku
12个回答

70
我在使用 Hadoop 1.1 时遇到了同样的问题。
我通过更改 /etc/hadoop/hadoop-env.sh 中的 JAVA_HOME 变量,解决了这个问题。具体做法如下:
export JAVA_HOME=/usr/lib/jvm/<jdk folder>

是的,这就是情况。它也适用于hadoop-2.6.0。谢谢! - ady
适用于hadoop-2.7.3。 - Steven Du
适用于hadoop-3.0。 - Hamdi Charef
8
"Hadoop仍然可用于3038年的工作" - Aydin K.
2021年可用,但我的本地主机仍无法运行。 - Shardul Birje
工作于3.3.4版本。 - vinayakshukre

21
解决此问题的方法是在conf/hadoop-env.sh文件中导出JAVA_HOME变量。
即使您已经在~/.bashrc中导出了该变量,它仍会显示错误。
因此,请编辑conf/hadoop-env.sh并取消注释“export JAVA_HOME”行,并将适当的文件系统路径添加到其中,即Java JDK的路径。

# 要使用的Java实现。必须的。
export JAVA_HOME="/path/to/java/JDK/"


5
我还必须明确设置它,而不是作为${JAVA_HOME}。 - Nikita R.
@NikitaG。我也是这样。即使我打印 ${JAVA_HOME} 总是输出正确的值,只有显式设置才有效。 - Aylwyn Lake
1
在hadoop-2.7.3中,hadoop-env.sh文件位于hadoop-2.7.3/etc/hadoop目录而不是conf目录。 - Kevin Zhao

4
在Ubuntu LTS 16.04上遇到了同样的问题。运行bash -vx ./bin/hadoop后发现它测试了java是否为目录。所以我将JAVA_HOME更改为文件夹,然后它就起作用了。
++ [[ ! -d /usr/bin/java ]]
++ hadoop_error 'ERROR: JAVA_HOME /usr/bin/java does not exist.'
++ echo 'ERROR: JAVA_HOME /usr/bin/java does not exist.'
ERROR: JAVA_HOME /usr/bin/java does not exist.

所以我在./etc/hadoop/hadoop-env.sh中更改了JAVA_HOME为

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/

并且Hadoop启动正常。


1

我曾经在 hadoop 1.1 中遇到过类似的问题。当时我没有注意到 JAVA_HOMEhadoop/conf/hadoop-env.sh 中被注释掉了。

那时候是这样的。

/#JAVA_HOME=/usr/lib/jvm/java-6-oracle

不得不将其更改为

JAVA_HOME=/usr/lib/jvm/java-6-oracle

我也遇到了同样的问题。 - Rakesh Yadav

1

从 etc/hadoop/hadoop-env.sh 提取

唯一必需的环境变量是 JAVA_HOME。其他所有变量都是可选的。当运行分布式配置时,最好在此文件中设置 JAVA_HOME,以便在远程节点上正确定义它。

这意味着最好和建议在这里设置 JAVA_HOME.. 即使现有的定义读取了 JAVA_HOME 变量。也许它没有从先前设置的值获取 JAVA_HOME 的值... 标准的 Apache 手册没有说明这一点 :( :(


1

调试的方法是在 start-all.sh 中加入 "echo $JAVA_HOME"。你是以不同的用户名运行 Hadoop 环境,还是以自己的名字运行?如果是前者,则该用户的 JAVA_HOME 环境变量很可能未设置。

另一个潜在的问题是您错误地指定了 JAVA_HOME,并且提供的值没有指向 JDK/JRE。请注意,“which java”和“java -version”都可以工作,即使 JAVA_HOME 设置不正确。


谢谢。当时我以Root身份运行它(为了避免权限问题),它覆盖了我的JAVA_HOME。最终我创建了一个新用户并赋予了正确的权限。Bash.Bashrc与新用户名一起工作。现在一切都很好[即已解决 :) ]。 - Ali Ismail

1
无论是Debian还是任何Linux版本,都要知道~/.bash_profile属于特定用户,而不是系统范围内的。 在伪分布式环境中,Hadoop在localhost上工作,因此.bash_profile中的$JAVA_HOME不再有用。 只需在~/.bashrc中导出JAVA_HOME并在整个系统中使用即可。

1
这个错误来自于第180行。
if [[ -z $JAVA_HOME ]]; then
   echo "Error: JAVA_HOME is not set and could not be found." 1>&2
   exit 1
fi

libexec/hadoop-config.sh 中尝试echo $JAVA_HOME。如果它不被识别,
使用以下内容找到您的JAVA_HOME$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") 并用上面命令得到的JAVA_HOME替换/etc/hadoop/hadoop-env.sh中的 export JAVA_HOME=${JAVA_HOME}行。

0

需要在 conf/hadoop-env.sh 文件中更改 JAVA_HOME 变量。

export JAVA_HOME=/etc/local/java/<jdk folder>

1
请问您能否详细阐述一下您的回答,并对您提供的解决方案进行更多描述? - abarisone

0

检查您的替代方案是否指向正确的版本,您可能实际上正在指向另一个版本,并尝试更改另一个已安装版本上的hadoop-env.sh。

-alternatives --install /etc/hadoop/conf [通用名称] [您的正确路径] 优先级 {有关进一步检查替代方案的man页面}

手动设置替代方案,

alternatives --set [通用名称] [您当前的路径]。


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