Hadoop:«ERROR: JAVA_HOME未设置»

54

我正在尝试在Ubuntu 11.10上安装Hadoop。我在文件conf/hadoop-env.sh中设置了JAVA_HOME变量:

# export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk

然后我执行这些命令(独立操作):

$ mkdir input 
$ cp conf/*.xml input 
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 
$ cat output/*

但是当我执行第三个命令时,出现了以下错误:

ERROR: JAVA_HOME未设置

JAVA_HOME变量是否设置正确?


7
那个 # 确实在那儿吗?如果是的话,那意味着这一行是注释。 - Dave Newton
@DaveNewton 把它作为答案发布,这样我就可以点赞了! - Donald Miner
2
这里有一个针对该问题的解决方案。该问题涉及旧的交互式/非交互式和登录/非登录shell概念:http://thinkinginsoftware.blogspot.com/2012/06/hadoop-pob-and-error-javahome-is-not.html - Nestor Urquiza
12个回答

64

请确保已经删除注释标签,并且在hadoop-env.sh中更改了 JAVA_HOME,以及相应的.bashrc和/或.profile文件:

# export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk

应该是这样的

export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk

你可以在/etc/profile中设置JAVA_HOMEPATH以供所有用户使用(确保您之前没有将其设置为错误的路径)。

此外,请不要忘记通过注销/登录或执行source /etc/profile来激活新更改。


37

你应该在Hadoop配置目录中的hadoop-env.sh文件中设置JAVA_HOME。默认情况下,JAVA_HOME的设置行是被注释掉的。


1
在当前版本2.9.0中,它存在,但会将当前环境的JAVA_HOME向前传递。文档中建议为分布式设置硬编码此值。我发现在单节点伪分布式操作中,将其设置在此处有所帮助。你的情况可能有所不同。 - russellpierce
是的@russellpierce,硬编码实际上是唯一有效的方法...不知为何,但设置/etc/environemnt、/etc/profile和.bashrc都没有起到任何帮助。 - Markus
对于那些找不到hadoop-env.sh文件的人,可以使用find hadoop/ -name hadoop-env.sh命令来查找。在我的电脑上,该文件位于.../hadoop/etc/hadoop/hadoop-env.sh。 - Guilherme Noronha

14

在终端中键入echo $JAVA_HOME,以确保您的JAVA_HOME已设置。

您还可以键入java -version来了解您实际使用的Java版本。

顺便说一下,从您的描述中可以看出您实际上正在编写

export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk

在文件conf/hadoop-env.sh中,你应该在终端或~/.bashrc~/.profile中编写它,然后输入source < path to modified file >


1
是的, # 默认存在,所以我删除了它,并再次尝试这4个命令,现在可以正常工作了。但是当我输入“echo $JAVA_HOME”时,我没有得到它的值,而当我输入“java -version”时,我得到了“java version "1.6.0_23" 。 OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23〜pre11-0ubuntu1.11.10) OpenJDK Server VM (build 20.0-b11, mixed mode)”。 这样正确吗? - koukou
3
如果在输入“echo $JAVA_HOME”后没有任何结果显示,则表示环境变量未正确设置。 输入“sudo vi ~/.bashrc”,然后在文件中添加以下内容:export JAVA_HOME=< java_path >,export PATH=$PATH:< java_path >/bin。接着输入“sudo source ~/.bashrc”。 - alain.janinm
1
我正在遵循这篇教程 http://hadoop.apache.org/common/docs/stable/single_node_setup.html#Download :JAVA_HOME 只在 conf/hadoop-env.sh 中定义。我在 hadoop-env.sh 文件中添加了 export PATH=$PATH:< java_path >/bin,输入“echo $ PATH”会显示路径,但输入“echo $ JAVA_HOME”会出现空格! - koukou
@alain.janinm - 您的链接已损坏。 - Jeremy Hajek
@JeremyHajek 感谢您的关注,经过一段时间后这种情况经常发生... 这是新链接: http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/ - alain.janinm
显示剩余6条评论

9
你可以在你的.bashrc文件中添加以下内容:
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

当您更新软件包时,它将动态更改。


2
我所采用的解决方案是在/etc/environment中设置我的JAVA_HOME
尽管JAVA_HOME可以在/etc/profile文件中设置,但首选位置是/etc/environment,适用于JAVA_HOME或任何系统变量。
在任何文本编辑器(如nano或vim)中打开/etc/environment并添加以下行:
JAVA_HOME="/usr/lib/jvm/your_java_directory"

加载变量:

source /etc/environment

检查变量是否正确加载:

echo $JAVA_HOME

1
我尝试了上述解决方案,但以下方法对我有效。
export JAVA_HOME=/usr/java/default

1
我尝试更改/etc/environment

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

在从节点上,它可以工作。

1
将此export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk复制到hadoop-env.sh文件中。 JAVA_HOME是Java二进制文件所在的位置。

0
在某些发行版(如CentOS/OpenSuSe等),只有在/etc/environment中设置JAVA_HOME时才能正常工作。

0

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