如何更改CDH使用的Java版本

时间:2015-03-04 12:37:50

标签: java hadoop cloudera-cdh

我目前在CentOS 6.5上使用java jdk1.7安装了CDH 5,我试图让CDH使用jdk1.8。

我知道Java 1.8不是推荐的CDH版本,但它只是一个测试集群,所以它不是什么大问题。

我使用RPM安装从Oracle网站安装了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. 分别在/etc/hadoop/conf/etc/zookeeper/conf下查看Hadoop和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目录,使用Java 1.7恢复到ZooKeeper。

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

4 个答案:

答案 0 :(得分:3)

我不想回答我自己的问题,但答案是:

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

  1. 使用命令service删除大多数环境变量。来自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. /usr/lib/bigtop-utils/bigtop-detect-javahome脚本可以使用环境变量BIGTOP_JAVA_MAJOR进行配置,以手动设置要使用的Java版本。我尝试将其设置为环境变量,但是service将其删除:(。请注意,此脚本将找到所有版本的Java,但优先顺序为Java 6,Java 7,Java 8,Open Java。所以如果你安装了Java 6和8,那么它将优先选择6而不是8。

  3. 简而言之,为了解决我的问题,我将以下内容添加到/usr/lib/bigtop-utils/bigtop-detect-javahome的顶部:

    BIGTOP_JAVA_MAJOR=8
    

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

答案 1 :(得分:3)

我来到这里是因为我正在寻找在最新的Coudera QuickStart VM 5.8上将JDK从1.7升级到1.8的方法(不能相信它们默认情况下还会用JDK1.7发货!)。上述答案中的提示和建议有很大帮助 - 但由于他们没有列出完成升级的完整步骤 - 我想我会补充一点来帮助像我这样的人。

因此,以下是将Cloudera QuickStart VM从JDK1.7升级到1.8的一整套步骤:

  • 检查您当前的JDK版本 - 开箱即用:

    [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)
    
  • 下载所需版本的JDK1.8.xx - 在我的情况下:jdk-8u111-linux-x64.tar.gz

用户' cloudera':

  • 解压并将生成的jdk1.8.0_111目录移动到/ usr / java目录:

    tar xzf jdk-8u111-linux-x64.tar.gz    
    sudo mv -f jdk1.8.0_111 /usr/java
    
  • 关闭所有Hadoop服务:

    $ for x in `cd /etc/init.d ; ls hadoop-*` ; do sudo service $x stop ; done
    
  • 更新bigtop-utils文件 - 将JAVA_HOME设置为新的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
    
  • 更新' cloudera'用户的.bash_profile - 导出JAVA_HOME并添加更新路径:

    export JAVA_HOME=/usr/java/jdk1.8.0_111
    PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
    export PATH
    
  • 重启您的虚拟机

  • 检查Java版本 - 现在应该是1.8版本:

    [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)
    

顺便说一下,我没有使用'最新的'设置/ usr / java / default。为了简单起见,sym link就像@ milk3422那样,但它也会起作用。

谢谢!

答案 2 :(得分:0)

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

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

覆盖默认检测值。这很棒!

答案 3 :(得分:0)

Java可在Web UI中配置。打开Cloudera Manger - >主持人 - >配置 - >高级,然后设置JAVA HOME。这取代了CDH的Java检测机制。