如何更改CDH使用的Java版本

7
我目前在CentOS 6.5上安装了CDH 5和java jdk1.7,现在我想让CDH使用jdk1.8。
我知道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启动。

为了解决这个问题,我尝试了几件事情:

  1. 查看Hadoop和ZooKeeper的conf文件(分别位于/etc/hadoop/conf/etc/zookeeper/conf),

    但没有发现设置JAVA_HOME的内容。

  2. 查看/usr/bin/zookeeper脚本,以确定是否在其他位置设置了JAVA_HOME

    我发现脚本/usr/lib/bigtop-utils/bigtop-detect-javahome具有设置JAVA_HOME的功能,但我的profile.d脚本覆盖了它。

  3. 手动将/usr/java/jdk1.7移动到/tmp

    可悲的是,这是唯一有效的方法。当我将jdk1.7目录移动到另一个目录并启动ZooKeeper时,它将使用Java 1.8。将jdk1.7目录移回后,ZooKeeper将恢复使用Java 1.7。

有没有人处理过这个问题,或者知道如何处理?我觉得我已经正确地设置了Java,但某些东西告诉ZooKeeper/Hadoop使用旧版本的Java?

4个回答

4
我来到这里是因为我正在寻找将JDK从1.7升级到最新的Coudera QuickStart VM 5.8上的方法(无法相信他们仍然默认安装JDK1.7!)。上面答案中的提示和建议非常有帮助,但由于它们没有列出实现升级的完整步骤,所以我认为我应该添加这些步骤以帮助像我一样的其他人。
以下是从JDK1.7升级到1.8的Cloudera QuickStart VM的完整步骤:
  • check your current JDK version - out-of-the-box it is:

    [cloudera@quickstart ~]$ java -version
    java version "1.7.0_67"
    Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
    Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
    
  • download desired version of JDK1.8.xx - in my case: jdk-8u111-linux-x64.tar.gz

作为用户“cloudera”:

  • untar and move the resulting jdk1.8.0_111 dir to the /usr/java dir:

    tar xzf jdk-8u111-linux-x64.tar.gz    
    sudo mv -f jdk1.8.0_111 /usr/java
    
  • shutdown all Hadoop services:

    $ for x in `cd /etc/init.d ; ls hadoop-*` ; do sudo service $x stop ; done
    
  • update bigtop-utils file - set JAVA_HOME to your new JDK:

     sudo vi /etc/default/bigtop-utils
    
     updated lines:
     # Override JAVA_HOME detection for all bigtop packages
     export JAVA_HOME=/usr/java/jdk1.8.0_111
    
  • update 'cloudera' user's .bash_profile - export JAVA_HOME and add update PATH:

    export JAVA_HOME=/usr/java/jdk1.8.0_111
    PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
    export PATH
    
  • restart your VM

  • check Java version - should be the 1.8 one now:

    [cloudera@quickstart ~]$ java -version
    java version "1.8.0_111"
    Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
    Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
    
顺便说一下,为了简单起见,我没有像@milk3422那样设置'/usr/java/default'的“最新”符号链接,但是这也同样有效。谢谢!

3

很抱歉,我得自己回答问题,以下是答案:

$JAVA_HOME被设置为错误版本的原因有两个:

  1. Using the command service removes most environmental variables. From man service:

    service  runs a System V init script in as predictable environment as 
    possible, removing most environment variables and with current work-
    ing directory set to /.
    
  2. The /usr/lib/bigtop-utils/bigtop-detect-javahome script has the ability to be configured with the environment variable BIGTOP_JAVA_MAJOR to manually set which version of Java to use. I tried setting this as an environment variable, but service removes it :(. It is also important to note that this script will find all versions of java installed, but the order of preference is Java 6, Java 7, Java 8, Open Java. So if you have Java 6, and 8 installed, it will prefer 6 over 8.

简而言之,为了解决我的问题,我在以下位置添加了以下内容:/usr/lib/bigtop-utils/bigtop-detect-javahome
BIGTOP_JAVA_MAJOR=8

您还可以在此文件中设置 JAVA_HOME 以指定特定版本或路径。


有一个/etc/default/bigtop-utils文件,应该用来进行手动覆盖。 - Oleksandr Pryimak

0

我曾经遇到过同样的问题。我设置了

JAVA_HOME=... below the file /usr/lib/bigtop-utils/bigtop-detect-javahome

覆盖默认检测值。这非常好!


0

Java可以在Web UI中进行配置。打开Cloudera Manager --> 主机 --> 配置 --> 高级,然后设置JAVA HOME。这将覆盖CDH的Java检测机制。


在Cloudera 5.13中,如果您在Web UI中设置了JAVA HOME,则除了由/usr/share/cmf/bin/cmf-server启动的CMF服务之外,所有内容都将使用该设置。cmf-server脚本确实会查找BIGTOP_JAVA_MAJOR。 - Concrete Gannet

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