【问题标题】:Spark job failing on jackson dependenciesSpark 作业在杰克逊依赖项上失败
【发布时间】:2018-01-06 20:48:53
【问题描述】:

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

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

1) 有时它的 oozie 启动器标记为成功,而其他标记为已终止,

2) 对于 spark 作业本身,我发现在 jackson 数据绑定上失败了。

2018-01-05 19:07:17,672 [驱动程序] 错误 org.apache.spark.deploy.yarn.ApplicationMaster - 用户类抛出 异常:java.lang.VerifyError:操作数堆栈异常上的错误类型 详细信息: 地点: org/apache/spark/metrics/sink/MetricsServlet.(Ljava/util/Properties;Lcom/codahale/metrics/MetricRegistry;Lorg/apache/spark/SecurityManager;)V @116:调用虚拟原因: 类型“com/codahale/metrics/json/MetricsModule”(当前帧,堆栈[2])不可分配给“com/fasterxml/jackson/databind/Module”

【问题讨论】:

  • 您找到解决方案了吗?

标签: apache-spark jackson


【解决方案1】:

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

在此处了解更多信息:http://www.oracle.com/technetwork/java/security-136118.html

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

spark-core 库中的 MetricServlet 类尝试实例化一个 MetricsModule 类型的对象,该对象封装在 metrics-json jar 中。 然后它尝试将此对象(在它的“ObjectMapper”中)注册为通用模块对象。 注意: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 的 CosmosDB 连接器的 Uber JAR 将 MetricsModule 和 Module 类打包。但后者打包在“cosmosdb_connector_shaded.jackson.databind.Module”下,给出完全相同的错误 -

“输入'com/codahale/metrics/json/MetricsModule'(当前帧, stack[2]) 不可分配给 'com/fasterxml/jackson/databind/Module'"

要解决此类冲突,您需要找到实际加载 MetricsModule 类的 JAR。将 -verbose:class JVM 选项与 Spark 驱动程序 JVM 一起使用来跟踪这一点。

【讨论】:

猜你喜欢
  • 2017-03-08
  • 2015-05-24
  • 2022-01-05
  • 1970-01-01
  • 2016-09-10
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多