我知道Java 1.8不是CDH的推荐版本,但这只是一个测试集群,所以没关系。
我已经从Oracle的网站上使用RPM安装了Java 1.7和Java 1.8,所以现在两个版本的Java都在/usr/java目录下。使用ls -ld命令查看我的Java目录,结果如下:
/usr/java/default -> /usr/java/latest
/usr/java/jdk1.7.0_75
/usr/java/jdk1.8.0_31
/usr/java/latest -> /usr/java/jdk1.8.0_31
我还在/etc/profile.d
中设置了脚本,将$JAVA_HOME
设置为/usr/java/default
。以下是我的profile.d脚本内容:
export JAVA_HOME=/usr/java/default
export PATH=${JAVA_HOME}/bin:${PATH}
当我感到自己具有这个权利时,我就开始行动:
$ which java
/usr/java/default/bin/java
告诉我它指向了默认符号链接的Java版本。为了确定正在运行哪个Java版本,我运行:
$ java -version
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
我可以看到当前正在运行Java 1.8。
一切似乎都很好,但当我尝试启动Hadoop服务时却出现问题。最容易启动的是ZooKeeper,因为它只有一个服务。HDFS有多个服务器,所以启动和停止ZooKeeper比较简单。
启动ZooKeeper需要使用以下命令:
$ sudo service zookeeper-server start
接着,为了检查 Java 运行的版本,我会在运行中的进程列表中搜索 java
:
$ ps -ef | grep java
495 7170 1 7 12:27 ? 00:00:00 /usr/java/jdk1.7.0_75/bin/java -Dzookeeper.datadir.autocreate=false -Dzookeeper.log.dir=/var/log/zookeeper -Dzookeeper.root.logger=INFO,ROLLINGFILE -cp /usr/lib/zookeeper/bin/../build/classes:/usr/lib/zookeeper/bin/../build/lib/*.jar:/usr/lib/zookeeper/bin/../lib/slf4j-log4j12.jar:/usr/lib/zookeeper/bin/../lib/slf4j-log4j12-1.7.5.jar:/usr/lib/zookeeper/bin/../lib/slf4j-api-1.7.5.jar:/usr/lib/zookeeper/bin/../lib/netty-3.2.2.Final.jar:/usr/lib/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/lib/zookeeper/bin/../lib/jline-0.9.94.jar:/usr/lib/zookeeper/bin/../zookeeper-3.4.5-cdh5.3.0.jar:/usr/lib/zookeeper/bin/../src/java/lib/*.jar:/etc/zookeeper/conf::/etc/zookeeper/conf:/usr/lib/zookeeper/*:/usr/lib/zookeeper/lib/* -Dzookeeper.log.threshold=INFO -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /etc/zookeeper/conf/zoo.cfg
我知道这段代码超出了屏幕范围,但重要的是Zookeeper由/usr/java/jdk1.7.0_75/bin/java
启动。
为了解决这个问题,我尝试了几件事情:
查看Hadoop和ZooKeeper的conf文件(分别位于
/etc/hadoop/conf
和/etc/zookeeper/conf
),但没有发现设置
JAVA_HOME
的内容。查看
/usr/bin/zookeeper
脚本,以确定是否在其他位置设置了JAVA_HOME
。我发现脚本
/usr/lib/bigtop-utils/bigtop-detect-javahome
具有设置JAVA_HOME
的功能,但我的profile.d脚本覆盖了它。手动将
/usr/java/jdk1.7
移动到/tmp
。可悲的是,这是唯一有效的方法。当我将jdk1.7目录移动到另一个目录并启动ZooKeeper时,它将使用Java 1.8。将jdk1.7目录移回后,ZooKeeper将恢复使用Java 1.7。
有没有人处理过这个问题,或者知道如何处理?我觉得我已经正确地设置了Java,但某些东西告诉ZooKeeper/Hadoop使用旧版本的Java?