java - 如何更改 CDH 使用的 Java 版本

标签 java hadoop cloudera-cdh

我目前在带有 java jdk1.7 的 CentOS 6.5 上安装了 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

告诉我它指向默认符号链接(symbolic link)的 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。

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

最佳答案

我来这里是因为我正在寻找在最新的 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)
    

顺便说一句,为了简单起见,我没有像 @milk3422 那样使用“最新”符号链接(symbolic link)设置/usr/java/default,但它也能正常工作。

谢谢!

关于java - 如何更改 CDH 使用的 Java 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28854722/

相关文章:

hadoop - Hadoop MapReduce中Mapper的最大输入文件大小(不分割)是多少?

java - ParseLong引发NumberFormatException

java - Try-Catch block 的多种组合 - Java

java - JSF : how to force creating a new managed bean instance for every browse instance

java - Hadoop - 通过套接字在 reducer 之间共享数据

hadoop - hive :无法访问数据库

r - 我们可以将 R 脚本或任何第三方软件安装到 CDH5(Hadoop 的 Cloudera 发行版)吗

hadoop - 在 Cloudera VM 中将数据从 HDFS 加载到 Hive Table

java - MVVM MediatorLiveData观察者onchanged被调用多次

java - Java-将所有音频文件导入目录中并进行连接