JAVA_HOME在Hadoop中未设置。

10

我是一个Hadoop的初学者,想在我的Ubuntu上安装和运行Hadoop作为单节点集群。这是我的hadoop_env.sh文件中的JAVA_HOME:

# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386/
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}

但是当我运行它时,出现以下错误 -

Starting namenodes on [localhost]
localhost: Error: JAVA_HOME is not set and could not be found.
localhost: Error: JAVA_HOME is not set and could not be found.
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Error: JAVA_HOME is not set and could not be found.

我该如何解决这个错误?

8个回答

19

我调试了代码,发现尽管JAVA_HOME在环境中设置了,但是当代码内部进行ssh连接到其他主机时,该值就会丢失。在start-dfs.sh中正确显示设置的JAVA_HOME变量,在hadoop-env.sh中却未设置。

解决这个问题的方法是在hadoop-env.sh中设置JAVA_HOME变量,然后它就可以正常工作了。


对于@toobee,这对我有用,但为什么呢?我不是Linux专家,所以为什么在SSH到本地机器时没有设置JAVA_HOME?我已经在我的~/.profile中设置了我的JAVA_HOME。 - Greg B
那是Hadoop代码中的一个错误。即使您在~/.profile中设置了JAVA_HOME,它的值也会在代码内被覆盖为其他内容。 - Sohil Jain
非常准确。作为另一种解决方案,您也可以将其设置在 /etc/environment 中,它也可以工作!:) - Prakhar Agrawal

15
我遇到了相同的错误,并通过Soil Jain的备注解决了它,但为了让它更加清晰:hadoop-env.sh使用类似以下的表达式
export JAVA_HOME=${JAVA_HOME}

如果您将JVM安装路径硬编码,它会起作用。

export JAVA_HOME=/usr/lib/jvm/java...

这个问题通过环境变量解决似乎失败了。对我来说,硬编码固定值解决了问题。


非常感谢您! - Halil İbrahim Oymacı
我曾经设置了一个硬编码,例如/usr/lib/jdk1.8.0_231,但是当DataNode重新启动时失败并出现错误信息resource_management.core.exceptions.ExecutionFailed: Execution of 'ambari-sudo.sh su hdfs -l -s /bin/bash -c 'ulimit -c unlimited ; /usr/hdp/3.1.4.0-315/hadoop/bin/hdfs --config /usr/hdp/3.1.4.0-315/hadoop/conf --daemon stop datanode'' returned 1. ERROR: JAVA_HOME /usr/lib/jdk1.8.0_231 does not exist. - wyx

6
在您的HADOOP_HOME/conf目录下,请更新hadoop-env.sh文件。该文件中有导出JAVA_HOME的条目。
在此文件中设置适当的JAVA_HOME应该可以解决您的问题。

2
我已经更新了它,将export JAVA_HOME=/usr/lib/jvm/java-7-sun导出为环境变量.. 仍然是相同的错误。 - ayushman999
在我的情况下,我在用户bash配置文件中删除了java_home变量,并在hadoop-env.sh文件中添加了上述条目后,成功启动了Hadoop。另外需要注意的是,在最新版本的Hadoop中,hadoop-env.sh文件的位置已经改变。即HADOOP_HOME/etc/hadoop/hadoop-env.sh。 - Ramgau

2

首先,您必须在hadoop_env.sh中设置JAVA_HOME。(您本地的.bashrc中的JAVA_HOME可能会被忽略)

# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/default-java

接下来,将HADOOP_CONF_DIR设置为您的hadoop_env.sh所在目录。在~/.bashrc文件中添加以下行:

HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
export HADOOP_CONF_DIR

/usr/local/hadoop/etc/hadoop 是包含 hadoop_env.sh 文件的目录。


2

我已经将它放在问题中。我已经更新了JAVA_HOME的导出。但是当我运行它时,错误仍然出现。这是因为使用openjdk7吗?还有,它有hadoop-env.sh。对于打字错误我很抱歉。 - ayushman999
不是的。根本没有设置 - 如果找不到Java,那就是另一个错误。 - griffon vulture
更简单的方法是通过你的 .bashrc 文件导出 JAVA_HOME。 - griffon vulture
我已经在.bashrc文件中设置了它。这是我在hadoop-env.sh文件和.bashrc文件中都放置的内容:export JAVA_HOME=/usr/lib/jvm/java-7-sun - ayushman999
我不能给你更多建议,除了使用我上面发送给你的指南重新安装。 - griffon vulture

1
我正在使用hadoop 2.8.0。尽管我导出了JAVA_HOME(我将其放在.bashrc中),但在尝试运行start-dfs.sh时仍然遇到了此错误。
user@host:/opt/hadoop-2.8.0 $ echo $JAVA_HOME
<path_to_java>
user@host:/opt/hadoop-2.8.0 $ $JAVA_HOME/bin/java -version
java version "1.8.0_65"
...
user@host:/opt/hadoop-2.8.0 $ sbin/start-dfs.sh
...
Starting namenodes on []
localhost: Error: JAVA_HOME is not set and could not be found.
localhost: Error: JAVA_HOME is not set and could not be found.

唯一的方法是在 etc/hadoop/hadoop-env.sh 中添加 JAVA_HOME=path_to_java 并运行 source 命令:
:/opt/hadoop-2.8.0 $ grep JAVA_HOME etc/hadoop/hadoop-env.sh
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=path_to_java
user@host:/opt/hadoop-2.8.0 $ source etc/hadoop/hadoop-env.sh

也许在上面的帖子中已经意味着(引用 hadoop-env.sh),只是想让有人大声说出来。现在可以运行了。我遇到了其他问题(我怀疑是由于我使用的服务器资源有限造成的),但至少我解决了这个问题。

0

以上答案应该适用于您使用默认的配置目录$HADOOP_HOME/conf$HADOOP_HOME/etc/hadoop的情况。如果您使用不同的配置文件夹,这里有几件事情您应该做。

  1. hadoop-env.sh文件从默认的conf目录复制到您的conf文件夹中,例如/home/abc/hadoopConf
  2. 将以下行

    #export JAVA_HOME=${JAVA_HOME}
    

    替换为:

    export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    export HADOOP_CONF_DIR=/home/abc/hadoopConf
    

适当更改这些值。如果您在.bashrc.profile.bash_profile中配置了任何其他与hadoop相关的环境变量,请考虑将它们添加到上述行旁边。


-1
它不知道“Program Files”中的空格。 因此,我将jdk文件夹复制到不包含空格的文件夹或C:驱动器中,并分配:export JAVA_HOME = Name_Path_Copied。我看到它运行正常。

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