如何更改CDH使用的Java版本

mil*_*422 6 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
Run Code Online (Sandbox Code Playgroud)

我也设置了脚本/etc/profile.d设置$JAVA_HOME/usr/java/default.我的profile.d脚本的内容:

export JAVA_HOME=/usr/java/default
export PATH=${JAVA_HOME}/bin:${PATH}
Run Code Online (Sandbox Code Playgroud)

所以,当我觉得我有这个权利时,我会跑:

$ which java
/usr/java/default/bin/java
Run Code Online (Sandbox Code Playgroud)

告诉我它指向默认的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)
Run Code Online (Sandbox Code Playgroud)

我可以看到我当前正在运行Java 1.8.

除非我尝试启动Hadoop服务,否则一切看起来都很棒.最容易启动的是ZooKeeper,因为它只有一个服务.HDFS有多​​个服务器,因此只需启动和停止ZooKeeper即可.

使用以下命令启动ZooKeeper:

$ sudo service zookeeper-server start
Run Code Online (Sandbox Code Playgroud)

然后检查它运行的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
Run Code Online (Sandbox Code Playgroud)

我知道,屏幕上运行,重要的是Zookeeper正在启动/usr/java/jdk1.7.0_75/bin/java.

为了解决这个问题,我尝试了一些方法:

  1. 下看的Hadoop和动物园管理员通过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目录,使用Java 1.7恢复到ZooKeeper.

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

mil*_*422 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 /.
    
    Run Code Online (Sandbox Code Playgroud)
  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。

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

BIGTOP_JAVA_MAJOR=8
Run Code Online (Sandbox Code Playgroud)

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