0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8

2019-11-28 23:39:12 浏览数 (1)

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1

文档编写目的

受前段时间Oracle官宣的从2019年1月之后将不再提供免费的的JDK商业版本的影响,Cloudera开始开发基于OpenJDK的Hadoop平台,参考Fayson之前的文章《Java收费,Hadoop怎么办?》。今年11月29日,Cloudera才发布不久的CDH5.16.1正式提供OpenJDK的支持,参考Fayson之前的文章《0466-CDH5.16.1和CM5.16.1的新功能》和《0486-如何将Kerberos的CDH5.16.1从Oracle JDK 1.8迁移至OpenJDK 1.8》。同时12月19日发布的《0487-CDH6.1的新功能》和《0488-Cloudera Manager6.1的新功能》,也开始支持OpenJDK。本文Fayson主要介绍如何将CDH6.1从Oracle JDK迁移到OpenJDK。

JDK的迁移需要重启整个集群,所以对于所有主机的重启你需要规划停机时间。如果你的集群启用了HDFS HA,可以使用滚动重启而不用规划停机时间。本文的方式会直接重启集群,如果是生产系统,需要规划停机时间。

  • 内容概述

1.CDH各版本的JDK支持说明

2.迁移JDK

3.检查JDK的使用版本

4.组件功能校验

5.总结

  • 测试环境

1.CM和CDH版本为6.1

2.采用root用户操作

3.Redhat7.4

2

CDH各版本的JDK支持说明

Cloudera Manager和CDH需要所有节点都安装了受支持的Java Development Kit (JDK) ,具体受支持的版本如下:

Cloudera Enterprise Version

Supported JDK

5.3 -5.15

Oracle JDK 1.7, Oracle JDK 1.8

5.16

Oracle JDK 1.7, Oracle JDK 1.8, OpenJDK 1.8

6.0

Oracle JDK 1.8

6.1

Oracle JDK 1.8, OpenJDK 1.8

3

迁移JDK

1.首先我们确认一下CDH集群的各个节点的JDK安装情况

代码语言:javascript复制
[root@ip-172-31-6-83 shell]# sh ssh_do_all.sh node.list "yum list installed |grep oracle"

可以注意到Fayson集群的的4个节点既安装了Oracle JDK1.7也安装了1.8。

2.我们在Cloudera Manager的页面上确认集群目前在使用的JDK版本。进入Cloudera Manager主页,然后点击“Support > About”。

集群使用的JDK是Oracle JDK1.8

3.安装Redhat自带的OpenJDK到各台节点,使用yum命令进行安装。

代码语言:javascript复制
[root@ip-172-31-6-83 shell]# sh ssh_do_all.sh node.list "yum -y install java-1.8.0-openjdk-devel"

4.登录到Cloudera Manager节点,编辑以下目录的文件

代码语言:javascript复制
/etc/default/cloudera-scm-server

增加以下内容:

代码语言:javascript复制
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk"

注意:OpenJDK的安装目录根据实际情况可能不同,请根据实际情况调整。

5.重启Cloudera Manager Server

代码语言:javascript复制
[root@ip-172-31-6-83 shell]# systemctl restart cloudera-scm-server

6.查看Cloudera Manager已经使用的是OpenJDK

7.移除所有节点的Oracle JDK

代码语言:javascript复制
[root@ip-172-31-6-83 shell]# sh ssh_do_all.sh node.list "yum -y remove oracle-j2sdk1.7"
代码语言:javascript复制
[root@ip-172-31-6-83 shell]# sh ssh_do_all.sh node.list "yum -y remove oracle-j2sdk1.8"

8.重启Cloudera Management Service

重启整个集群服务

4

检查JDK的使用版本

1.以Cloudera Management Service的其中一个服务Alert Publisher为例进行查看,首先我们在Cloudera Manager的界面查看进程ID

到后台查看该进程的环境变量

可以发现已经是openJDK

2.再以YARN的ResourceManager服务为例查看使用的JDK版本,我们依旧到Cloudera Manager上查看进程ID

到后台终端确认ResourceManger服务的环境变量

可以看到已经是使用的OpenJDK

5

组件功能校验

1.Kerberos环境下提交MapReduce作业

代码语言:javascript复制
[root@ip-172-31-6-83 java]# kinit fayson
JAR does not exist or is not a normal file: /opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/lib/hadoop-0.20-mapreduce/hadoop-examples.jar
[root@ip-172-31-6-83 java]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: fayson@FAYSON.COM

Valid starting       Expires              Service principal
12/29/2018 21:37:16  12/30/2018 21:37:16  krbtgt/FAYSON.COM@FAYSON.COM
        renew until 01/05/2019 21:37:16
[root@ip-172-31-6-83 java]# hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 10 1

作业执行成功

2.运行Hive作业

代码语言:javascript复制
[root@ip-172-31-6-83 java]# beeline
WARNING: Use "yarn jar" to launch YARN applications.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/jars/log4j-slf4j-impl-2.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/jars/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.1.1-cdh6.1.0 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/;principal=hive/ip-172-31-6-83.ap-southeast-1.compute.internal@FAYSON.COM
Connecting to jdbc:hive2://localhost:10000/;principal=hive/ip-172-31-6-83.ap-southeast-1.compute.internal@FAYSON.COM
Connected to: Apache Hive (version 2.1.1-cdh6.1.0)
Driver: Hive JDBC (version 2.1.1-cdh6.1.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000/> show tables;
INFO  : Compiling command(queryId=hive_20181229214127_90e75174-6be5-4579-bd84-b4f336a7fe94): show tables
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:tab_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hive_20181229214127_90e75174-6be5-4579-bd84-b4f336a7fe94); Time taken: 1.189 seconds
INFO  : Executing command(queryId=hive_20181229214127_90e75174-6be5-4579-bd84-b4f336a7fe94): show tables
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hive_20181229214127_90e75174-6be5-4579-bd84-b4f336a7fe94); Time taken: 0.079 seconds
INFO  : OK
 ----------- 
| tab_name  |
 ----------- 
| t1        |
 ----------- 
1 row selected (2.031 seconds)
0: jdbc:hive2://localhost:10000/> select count(*) from test;
Error: Error while compiling statement: FAILED: SemanticException [Error 10001]: Line 1:21 Table not found 'test' (state=42S02,code=10001)
0: jdbc:hive2://localhost:10000/> select count(*) from t1;
INFO  : Compiling command(queryId=hive_20181229214145_7e6b27e8-dac8-4529-85e0-ec3b6ce6c9c2): select count(*) from t1
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_c0, type:bigint, comment:null)], properties:null)
INFO  : Completed compiling command(queryId=hive_20181229214145_7e6b27e8-dac8-4529-85e0-ec3b6ce6c9c2); Time taken: 0.445 seconds
INFO  : Executing command(queryId=hive_20181229214145_7e6b27e8-dac8-4529-85e0-ec3b6ce6c9c2): select count(*) from t1
WARN  : 
INFO  : Query ID = hive_20181229214145_7e6b27e8-dac8-4529-85e0-ec3b6ce6c9c2
INFO  : Total jobs = 1
INFO  : Launching Job 1 out of 1
INFO  : Starting task [Stage-1:MAPRED] in serial mode
INFO  : Number of reduce tasks determined at compile time: 1
INFO  : In order to change the average load for a reducer (in bytes):
INFO  :   set hive.exec.reducers.bytes.per.reducer=<number>
INFO  : In order to limit the maximum number of reducers:
INFO  :   set hive.exec.reducers.max=<number>
INFO  : In order to set a constant number of reducers:
INFO  :   set mapreduce.job.reduces=<number>
INFO  : number of splits:1
INFO  : Submitting tokens for job: job_1546090332827_0002
INFO  : Executing with tokens: [Kind: HDFS_DELEGATION_TOKEN, Service: 172.31.6.83:8020, Ident: (token for fayson: HDFS_DELEGATION_TOKEN owner=fayson, renewer=yarn, realUser=hive/ip-172-31-6-83.ap-southeast-1.compute.internal@FAYSON.COM, issueDate=1546090906263, maxDate=1546695706263, sequenceNumber=10, masterKeyId=5), Kind: HIVE_DELEGATION_TOKEN, Service: HiveServer2ImpersonationToken, Ident: 00 06 66 61 79 73 6f 6e 06 66 61 79 73 6f 6e 3e 68 69 76 65 2f 69 70 2d 31 37 32 2d 33 31 2d 36 2d 38 33 2e 61 70 2d 73 6f 75 74 68 65 61 73 74 2d 31 2e 63 6f 6d 70 75 74 65 2e 69 6e 74 65 72 6e 61 6c 40 46 41 59 53 4f 4e 2e 43 4f 4d 8a 01 67 fa 32 82 0e 8a 01 68 1e 3f 06 0e 01 01]
INFO  : The url to track the job: http://ip-172-31-6-83.ap-southeast-1.compute.internal:8088/proxy/application_1546090332827_0002/
INFO  : Starting Job = job_1546090332827_0002, Tracking URL = http://ip-172-31-6-83.ap-southeast-1.compute.internal:8088/proxy/application_1546090332827_0002/
INFO  : Kill Command = /opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/lib/hadoop/bin/hadoop job  -kill job_1546090332827_0002
INFO  : Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
INFO  : 2018-12-29 21:41:55,587 Stage-1 map = 0%,  reduce = 0%
INFO  : 2018-12-29 21:42:03,810 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.91 sec
INFO  : 2018-12-29 21:42:09,965 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 4.35 sec
INFO  : MapReduce Total cumulative CPU time: 4 seconds 350 msec
INFO  : Ended Job = job_1546090332827_0002
INFO  : MapReduce Jobs Launched: 
INFO  : Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 4.35 sec   HDFS Read: 7955 HDFS Write: 101 HDFS EC Read: 0 SUCCESS
INFO  : Total MapReduce CPU Time Spent: 4 seconds 350 msec
INFO  : Completed executing command(queryId=hive_20181229214145_7e6b27e8-dac8-4529-85e0-ec3b6ce6c9c2); Time taken: 25.491 seconds
INFO  : OK
 ------ 
| _c0  |
 ------ 
| 1    |
 ------ 
1 row selected (26.088 seconds)

作业执行成功

6

常见错误

1.在卸载完所有节点的Cloudera提供的Oracle JDK1.7/1.8后,重启完Cloudera Manager Server后,在界面上重启Cloudera Management Service时报错如下:

报错如下:

代码语言:javascript复制
Error: dl failure on line 893
Error: failed /usr/java/jdk1.8.0_131/jre/lib/amd64/server/libjvm.so, because /usr/java/jdk1.8.0_131/jre/lib/amd64/server/libjvm.so: cannot open shared object file: Permission denied

发现是因为Fayson集群的Cloudera Manager节点的/usr/java目录还有之前安装的一个jdk,CMS服务会默认先去找这个目录下的JDK。

直接删除这个文件夹,再次重启CMS,成功。

7

总结

1.默认的OpenJDK安装路径是/usr/lib/jvm,只要你根据操作系统的yum命令默认安装的,无论是Cloudera Management Service还是Hadoop其他的服务都不需要额外配置Java Home,Cloudera Manager会帮你默认使用正确的OpenJDK,但你最好先卸载所有节点上的所有Oracle JDK。

2.Cloudera Manager Server服务需要单独配置Java Home才能保证启动Manager的服务使用的环境变量为OpenJDK。

3.如果你的OpenJDK不是安装在默认目录,需要单独配置Java Home,依旧可以在Cloudera Manage界面上完成,参考《如何将Kerberos环境下CDH集群JAVA升级至JDK8》。

4.注意本文在从Oracle JDK迁移到OpenJDK过程,你需要先卸载所有机器上的Oracle JDK,然后使用默认方式安装OpenJDK后,再重启Cloudera Management Service和整个Hadoop集群服务。

5.虽然是Kerberos环境,我们本次迁移到OpenJDK,没有再专门拷贝Java的无限制加密文件jce,因为OpenJDK默认包含了,相应可以参考Fayson之前的文章《如何将Kerberos环境下CDH集群JAVA升级至JDK8》从JDK7升级到JDK8有专门拷贝整个文件。

6.如果你的环境中在/usr/java目录下还有其他的JDK1.7或者1.8,注意要清理干净,否则有可能CMS或者Hadoop集群服务依旧没有使用OpenJDK,参考第6章常见错误。

本文迁移过程参考:

https://www.cloudera.com/documentation/enterprise/upgrade/topics/ug_jdk8.html#concept_ct4_ppr_55

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

0 人点赞