1 报错问题
具体报错日志截图如下:
核心日志提示:
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/spark/network/sasl/SecretKeyHolder : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
2 问题定位
初步分析该错误是由于jdk版本问题导致, 项目中使用jar包是jdk 1.8版本进行编译,考虑检查所在TDH集群环境jdk版本是否不一致导致。
3 集群环境说明
10.20.37.125 tdh-01 // 节点1
10.20.37.126 tdh-02 // 节点2
10.20.37.127 tdh-03 // 节点3
10.21.3.257 bdata // 服务器
4 思路分析
jdk版本不兼容,所在集群环境是TDH环境,模式为Spark on Yarn模式,Yarn资源是容器化的,spark任务是提交到node-manager容器里执行,所以需要在yarn对应路径配置JAVA_HOME路径。
5 解决方案
5.1 检查集群对应节点及服务器是否安装jdk及其版本
[root@tdh-01 ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@tdh-01 ~]#
[root@tdh-01 ~]# find / -name '*jdk1.8*'
/var/log/yarn1/jdk1.8.0_191-amd64
/usr/java/jdk1.8.0_191-amd64
特别注意:该路径必须配置的是yarn容器里已经挂载的路径“/var/log/yarn1/jdk1.8.0_191-amd64”,否则访问不到!!!
5.2 确认jdk挂载路径是否为yarn对应路径
由步骤5.1可知,该节点已安装jdk,其版本为“jdk1.8.0_191-amd64”,但是存在两个路径,一个是默认安装路径“/usr/java/jdk1.8.0_191-amd64”,一个是yarn容器里已经挂载的路径“/var/log/yarn1/jdk1.8.0_191-amd64”,因此可以确认正确挂载路径为““/var/log/yarn1/jdk1.8.0_191-amd64”
5.3 在spark-defaults.conf文件里配置以下两个参数**
1) 查找spark-defaults.conf文件
[root@bdata conf]# pwd
/opt/bigdata/env/spark_env/conf
[root@bdata conf]# ll
total 92
-rwxrwxrwx. 1 root root 4579 Jan 6 11:28 core-site.xml
-rwxrwxrwx. 1 1000 1000 996 Oct 29 2019 docker.properties.template
-rwxrwxrwx. 1 1000 1000 1105 Oct 29 2019 fairscheduler.xml.template
-rwxrwxrwx. 1 root root 5242 Jan 6 10:15 hdfs-site.xml
-rwxrwxrwx. 1 root root 8203 Jan 6 12:42 hive-site.xml
-rwxrwxrwx. 1 root root 2025 Jan 4 09:53 log4j.properties
-rwxrwxrwx. 1 1000 1000 2025 Oct 29 2019 log4j.properties.template
-rwxrwxrwx. 1 1000 1000 7801 Oct 29 2019 metrics.properties.template
-rwxrwxrwx. 1 root root 22 Jan 6 15:18 slaves
-rwxrwxrwx. 1 1000 1000 865 Oct 29 2019 slaves.template
-rwxr-xr-x. 1 root root 1422 Jan 6 17:35 spark-defaults.conf
-rwxrwxrwx. 1 1000 1000 1292 Oct 29 2019 spark-defaults.conf.template
-rwxrwxrwx. 1 root root 4500 Jan 6 14:11 spark-env.sh
-rwxrwxrwx. 1 1000 1000 4221 Oct 29 2019 spark-env.sh.template
-rwxrwxrwx. 1 root root 6679 Jan 6 11:45 yarn-site.xml
2)添加spark默认参数
[root@bdata conf]# vim spark-defaults.conf
添加以下两个参数:
spark.yarn.appMasterEnv.JAVA_HOME /var/log/yarn1/jdk1.8.0_191-amd64
spark.executorEnv.JAVA_HOME /var/log/yarn1/jdk1.8.0_191-amd64
6 回顾总结
通过以上方式顺利解决报错问题,期间也踩了不少坑,比如以为TDH环境和CDH环境一样,默认jdk安装路径“/usr/java/jdk1.8.0_191-amd64”就是 spark on yarn模式下对应的jdk路径,实际上在spark-defaults.conf中添加默认路径后依然报同样错误。
所以需要了解YARN底层原理,必须配置的是yarn容器里已经挂载的路径, 如“/var/log/yarn1/jdk1.8.0_191-amd64”,然后执行成功。