【问题标题】:How to change the version of Java that CDH uses如何更改 CDH 使用的 Java 版本
【发布时间】:2015-03-04 12:37:49
【问题描述】:

我目前在 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。

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

【问题讨论】:

    标签: java hadoop cloudera-cdh


    【解决方案1】:

    我来到这里是因为我正在寻找在最新的 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 那样使用“最新”符号链接设置 /usr/java/default,但它也可以正常工作。

    谢谢!

    【讨论】:

      【解决方案2】:

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

      $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、打开 Java。所以如果你安装了 Java 6 和 8,它会更喜欢 6 而不是 8。

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

      BIGTOP_JAVA_MAJOR=8
      

      您也可以在这个文件中设置JAVA_HOME来指定具体的版本或路径。

      【讨论】:

      • 有一个 /etc/default/bigtop-utils 文件应该用于手动覆盖。
      【解决方案3】:

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

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

      覆盖默认检测值。效果很好!

      【讨论】:

        【解决方案4】:

        Java 可在 Web UI 中进行配置。打开 Cloudera Manger --> Hosts --> Configurations --> Advanced,然后设置 JAVA HOME。这会覆盖 CDH 的 Java 检测机制。

        【讨论】:

        • 在 Cloudera 5.13 中,如果您在 Web UI 中设置 JAVA HOME,那么一切都会使用它,但有一个例外: /usr/share/cmf/bin/cmf-server 启动的 CMF 服务。 cmf-server 脚本确实会查找 BIGTOP_JAVA_MAJOR。
        猜你喜欢
        • 2019-03-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2015-09-01
        • 2021-06-25
        • 1970-01-01
        • 2010-09-20
        相关资源
        最近更新 更多