Spark工作在jackson依赖项上失败

时间:2018-01-06 20:48:54

标签: apache-spark jackson

我从5.5.4升级cdh后失败的火花作业spark 1.5.0 to cdh 5.13.0 spark 1.6.0

作业正在运行新的火花依赖项,但我看到一个火花作业的奇怪行为:

1)有时它的oozie发射器标记为成功,其他标记为已杀死,

2)同样对于火花作业本身,我看到杰克逊数据绑定失败了。

  

2018-01-05 19:07:17,672 [Driver] ERROR   org.apache.spark.deploy.yarn.ApplicationMaster - 用户类扔了   exception:java.lang.VerifyError:操作数堆栈上的错误类型异常   详细信息:位置:       组织/阿帕奇/火花/度量/宿/ MetricsServlet(Ljava / UTIL /属性; LCOM / codahale /度量/ MetricRegistry; Lorg /阿帕奇/火花/安全管理器):V   @ 116:invokevirtual原因:       键入'com / codahale / metrics / json / MetricsModule'(当前帧,堆栈[2])不能分配给'com / fasterxml / jackson / databind / Module'

1 个答案:

答案 0 :(得分:0)

您遇到的错误是 Java字节码验证错误。 这是在类加载器将类加载到JVM之前发生的。 此步骤的目的是确保代码不是来自恶意编译器,而是确实遵循Java语言规则。

在此处详细了解:http://www.oracle.com/technetwork/java/security-136118.html

现在,解决您的问题。当您的代码在运行时找到与编译时使用的jar /类不同的jar /类时,也会引发此错误。

spark-core库中的MetricServlet类试图实例化MetricsModule类型的对象,该对象包装在metrics-json jar中。 然后,它尝试将该对象(在“ ObjectMapper”内部)注册为通用Module对象。 注意:MetricsModule从jackson-databind jar的Module类扩展。 因此,简单来说,将MetricsModule类型的对象类型转换为父类Module。

但是,您环境中的MetricsModule类不是从metrics-json Jar加载的,而是从其他一些外部Jar或第三方库加载的,它们在其中扩展了另一个Module父类此Jar必须使用some.other.package.Module类而不是来自jackson-databind的原始com.fasterxml.jackson.databind.Module进行编译。

例如适用于Spark的Uber JAR for CosmosDB连接器打包了MetricsModule和Module类。但是后者打包在“ cosmosdb_connector_shaded.jackson.databind.Module”下,给出了完全相同的错误-

  

“键入'com / codahale / metrics / json / MetricsModule'(当前帧,   stack [2])无法分配给   'com / fasterxml / jackson / databind / Module'“

要解决此类冲突,您需要找到实际加载MetricsModule类的JAR。在您的Spark Driver JVM中使用 -verbose:class JVM选项来进行跟踪。