Spark:不支持的类版本错误

4
我正在尝试在一个所有节点都安装了Java 1.7的集群上使用spark-submit运行一个Java Spark作业。然而,该作业失败并出现了java.lang.UnsupportedClassVersionError: com/windlogics/dmf/wether/MyClass: Unsupported major.minor version 51.0的错误。该错误似乎是由于使用较低版本的Java进行编译,而在较高版本上运行所致。但是,我已经验证代码是使用1.7进行编译的。此外,当主节点设置为本地时,该作业正常工作。请问我该如何调试和解决这个错误?下面是错误日志的一部分。
15/01/21 15:14:57警告scheduler.TaskSetManager:在阶段0.0(TID 0,sphddp07.zzz.local)中丢失任务0.0:java.lang.UnsupportedClassVersionError:com/zzz/dmf/wether/MyClass:不支持的主次版本号51.0 java.lang.ClassLoader.defineClass1(Native Method) java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) java.lang.ClassLoader.defineClass(ClassLoader.java:615) java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) java.net.URLClassLoader.defineClass(URLClassLoader.java:283) java.net.URLClassLoader.access$000(URLClassLoader.java:58) java.net.URLClassLoader$1.run(URLClassLoader.java:197) java.security.AccessController.doPrivileged(Native Method) java.net.URLClassLoader.findClass(URLClassLoader.java:190) java.lang.ClassLoader.loadClass(ClassLoader.java:306) java.lang.ClassLoader.loadClass(ClassLoader.java:247) java.lang.Class.forName0(Native Method) java.lang.Class.forName(Class.java:247) org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:59) java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574) java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) java.io.ObjectInputStream.readClass(ObjectInputStream.java:1461) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1311) java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) scala.collection.immutable.$colon$colon.readObject(List.scala:362) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) scala.collection.immutable.$colon$colon.readObject(List.scala:362) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)

所有节点都已安装Java 1.7 - 但是您是否正在使用Java 1.7?您能否记录java.version系统属性的值? - Jon Skeet
我在我的主方法中添加了System.err.println("Java Version: " + System.getProperty("java.version")),它输出了"Java Version: 1.7.0_45"。虽然如此,我实际上并不知道这段代码是否在集群节点上运行。 - Innuo
好的,所以你需要找出来。很抱歉这么挑剔,但当看起来像是环境问题时,你真的需要找到问题所在的确切版本。(版本51 用于Java 1.7,因此看起来某个地方正在运行早期版本。) - Jon Skeet
你好,这个问题解决了吗?也许这个应用程序正在使用Java 8? - code
@inno 你们使用什么类型的集群?是Spark集群还是Yarn?根据不同的情况,我可能有答案。 - user1314742
显示剩余3条评论
3个回答

1
我遇到了相同的错误信息。我发现当我输入'java -version'时,它是1.7版本的Java,而我需要的是Java 8。以下是更新步骤:
sudo yum install java-1.8.0
sudo alternatives --config java

1
我遇到了同样的问题,尝试在主机和从机的bashrc文件中设置适当的JAVA_HOME,但这并没有帮助解决问题。
然后,当我在整个集群级别上设置JAVA_HOME时,主要的错误已经消失了。我使用的是Cloudera,所以我必须在Cloudera Manager中设置JAVA_HOME来解决这个错误。

0
请查看Spark文档页面https://spark.apache.org/docs/latest/上的Spark版本和相应的JDK要求。
例如,Spark 2.4.5运行在Java 8上,而我系统上安装了Java 13。通过将我的系统移动到所需的JDK,解决了这个问题。

你可以拥有多个版本的Java并且仍然运行代码,唯一需要做的是设置正确的Java Home,然后你就可以开始了。 - Deepesh Rehi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接