spark提交jar包时出现unsupported major.minor version 52.0错误的解决方案

Posted 一杯浮生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark提交jar包时出现unsupported major.minor version 52.0错误的解决方案相关的知识,希望对你有一定的参考价值。

一、问题:

    最近在spark集群上做一个项目,打包提交jar包时,出现了unsupported major.minor version 52.0的报错,而在local模式运行却能正常运行!

二、错误原因:

    查阅诸多资料得出的结论就是:项目编译得到的class文件的版本高于运行环境中jre的版本号,高版本JDK编译的class不能在低版本的jvm虚拟机下运行,否则就会报这类错,因此无法运行!49,50,51,52是Java编译器内部的版本号,版本对应信息如下:

  Unsupported major.minor version 52.0 对应于 JDK1.8(JRE1.8) 

  Unsupported major.minor version 51.0 对应于 JDK1.7(JRE1.7) 

  Unsupported major.minor version 50.0 对应于 JDK1.6(JRE1.6) 

  Unsupported major.minor version 49.0 对应于 JDK1.5(JRE1.5) 

 

  因此出现问题的原因就是:编译产生的class文件是jdk1.8版本的,而jvm环境低于1.8,因此报错:

三、解决过程:

    首先我先去产看了一下编译产生的class文件的版本号,进入工程目录的class文件所在文件夹,使用 javap -verbose classname.class命令(classname是编译得到的class名,这里我的是JTool)查看编译版本如下:

    

  major version: 52,即编译的jdk版本是1,8的,因此必须运行在1.8的jvm中,接下来我又去查看ubuntu的jdk版本:

  用java -version查看jdk版本如下:

    

  可以看出,ubuntu的java版本也是jdk1.8的,因此应该是可以去正常运行的!考虑到这是在spark集群上运行jar包,我有思考是不是spark配置里面默认使用了低版本的jdk,导致问题的出现,便又去查看了spark的环境配置文件spark-env.sh,如下:

         

  果然,spark配置文件中的java版本是jdk1.7的,和ubuntu环境配置的java版本不一致,这就导致了问题的出现!只要把spark-env.sh中JAVA_HOME的参数修改为已安装的jdk目录就可以了!

 至此,问题解决!

四、补充:

   众所周知,软件基本都有向下兼容的特性,因此高版本的jdk是可以编译产生低版本的class文件的,在IntelliJ IDEA中的方法如下:
  首先,进入settings

    

  然后,找到Java Compiler那一项:

    

  做如下修改:    

     这样就可以在jdk1.8的环境下,编译产生1.7的class文件,也就可以在对应低版本的jvm中运行了!

以上是关于spark提交jar包时出现unsupported major.minor version 52.0错误的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

提交 pyspark 作业时出现语法错误

spark-任务提交多个jar包问题(Oozie调度)

git pull时出现unable to unlink old 一个不该犯下的错误

从 RDD 中的元组中解包项目时出现 Spark 错误

SpringMVC---REST POST时出现415 Unsupported Media Type

尝试通过 Postman 调用 OWIN OAuth 安全 Web Api 来获取 JWT 时出现“错误”:“unsupported_grant_type”