温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
提示:代码块部分可以左右滑动查看噢
本文感谢合合信息_陈雨明提出意见
1.文档编写目的
在前面的文章《如何将CDH集群JAVA升级至JDK8》有介绍升级方式,在JDK升级至JDK8后CM管理的CMS和CDH各个服务的JDK版本都已升级为相应的版本。但在CM服务重启后依然使用的JDK7的版本。在文中的解决方法是将jdk7的安装目录删除。有热心的粉丝也提到这种方式不能从根本上解决问题,给出了如下解决方法需要修改两个配置文件:
- 修改/usr/lib64/cmf/service/common/cloudera-config.sh文件,将该文件中77-78行的 JAVA7_HOME_CANDIDATES 与 JAVA8_HOME_CANDIDATES 位置互换
- /opt/cloudera/parcels/CDH/lib/bigtop-utils/bigtop-detect-javahome文件中82-83行的 JAVA7_HOME_CANDIDATES与JAVA8_HOME_CANDIDATES位置互换
如上方式修改可以确保CMS和CDH的所有服务使用JDK8的环境变量这里是没有问题的,但Cloudera-scm-server服务使用的JDK版本任然使用的是JDK7。
2.cloudera-scm-server服务启动脚本分析
1.在CM部署节点上找到cloudera-scm-server的启动脚本
(可左右滑动)
找到CM服务的启动脚本为/etc/rc.d/init.d/cloudera-scm-serverr,在启动命令脚本中可以看到启动CM服务是调用的/usr/sbin/cmf-server脚本
2.通过/usr/sbin/cmf-server服务找到CM服务启动的最终执行脚本为
3.分析/usr/share/cmf/bin/cmf-server脚本,得出如下结论
在脚本中定义了locate_java_home方法,该方法中初始了JAVA6、OPENJAVA6、JAVA7、OPENJAVA7等不同版本的JDK目录
在locate_java_home的方法中有一段根据参数初始化不同版本的JDK环境,这里调试了下BIGTOP_JAVA_MAJOR为空并为指定
所以上述的判断默认为进入“*)”判断中,这样得到的JAVA_HOME_CANNDIDATES变量为指定的所有版本的JAVA初始化目录,接下来的方法就会在指定的所有JAVA目录中找到可用的JAVA版本。
这里的这个判断就与我们热情的粉丝提出的一致,将JAVA7和JAVA8的位置互换,因为在对目录循环验证查找可用java命令时会优先验证JAVA8的目录。
3.总结
1.通过CM的启动脚本分析可以看到不同版本的JDK目录是在脚本中写死的,所以我们在部署JDK版本时一定要与脚本中指定的目录前缀一致,如指定JDK8的时需要设置JDK的HOME目录为jdk1.8{.xxx}的方式。像在做JDK升级的时候我们只需要将旧版本的jdk1.7xxx修改一个与默认配置不一致的名字则CM启动时就不会再检索到这个目录。
2.CM服务的启动脚本中实际上是不会涉及到cloudera-config.sh和bigtop-detect-javahome两个脚本。
3.关于cloudera-config.sh和bigtop-detect-javahome两个脚本这两个脚本主要提供给CDH和CMS下所有服务使用,在CM上配置了JDK8的路径后,CDH和CMS服务会在启动前默认的export JAVA_HOME的环境变量,所以这两个脚本中的JAVA环境变量判断部分是不会影响到JDK的版本。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操