我有Spark作业是失败后,从5.5.4
升级的cdh有spark 1.5.0 to cdh 5.13.0
,有spark 1.6.0
该作业正在使用新的Spark依赖项运行,但我发现一个Spark作业的行为异常:
1)有时候它的oozie发射器标记为成功,而其他标记为死亡,
2)此外,对于Spark工作本身,我看到这是失败的Jackson数据绑定。
2018-01-05 19:07:17,672 [驱动程序]错误组织.apache.spark.deploy.yarn.ApplicationMaster -用户类抛出异常:java.lang.VerifyError:操作数堆栈上的类型错误。异常详细信息:您的位置:首页〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉Lcom/代码/度量/度量注册表;安全管理器;)V@116:调用虚拟原因:类型'com/codahale/metrics/json/MetricsModule'(目前框架,堆栈[2])无法指派给'com/fasterxml/Jackson/databind/Module'
3条答案
按热度按时间js5cn81o1#
您收到的错误是Java字节码验证错误。此错误发生在类加载器将类加载到JVM之前。此步骤的目的是确保代码不是来自恶意编译器,而是确实遵循Java语言规则。
在此阅读更多信息:http://www.oracle.com/technetwork/java/security-136118.html
现在,解决你的问题。当你的代码在运行时发现与编译时使用的不同的jar/类时,也会抛出这个错误。
spark-core库中的MetricServlet类尝试示例化MetricsModule类型的对象,该对象被打包在metrics-json jar中。然后它尝试将此对象(在其'ObjectMapper'中)注册为通用Module对象。注意:MetricsModule扩展自jackson-databind jar的Module类,因此,简单地说,MetricsModule类型的对象被类型转换为父类Module。
例如,用于Spark的CosmosDB连接器的Uber JAR同时打包了MetricsModule和Module类。但后者被打包在"cosmosdb_connector_shaded. jackson. databind. Module"下,给出了完全相同的错误-
类型"com/codahale/metrics/json/MetricsModule"(当前帧,堆栈[2])无法分配给"com/fasterxml/jackson/数据绑定/模块"
要解决此类冲突,您需要找到实际加载MetricsModule类的JAR。请使用**-verbose:class**JVM选项和Spark Driver JVM来跟踪此冲突。
sf6xfgos2#
@sg1的解释是准确的。对我来说,我通过添加jar作为
spark.driver.extraClassPath
的一部分而不是复制它们到spark的jars/
目录中来修复这个错误。你也可以尝试在你的uber jar中为特定的依赖项(如Jackson)添加阴影。6psbrbz93#
由于Spark已经发布了metrics-json jar,我们可以将作用域标记为已提供,这将解决冲突。