Spark作业在jackson依赖项上失败

jobtbby3  于 2022-11-23  发布在  Spark
关注(0)|答案(3)|浏览(191)

我有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'

js5cn81o

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。

    • 但是,您的环境中的MetricsModule类不是从metrics-json Jar加载的,而是从某个其他外部Jar或第三方库加载的,它在其中扩展了另一个Module父类**。此Jar必须是使用某个. 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"(当前帧,堆栈[2])无法分配给"com/fasterxml/jackson/数据绑定/模块"
要解决此类冲突,您需要找到实际加载MetricsModule类的JAR。请使用**-verbose:class**JVM选项和Spark Driver JVM来跟踪此冲突。

sf6xfgos

sf6xfgos2#

@sg1的解释是准确的。对我来说,我通过添加jar作为spark.driver.extraClassPath的一部分而不是复制它们到spark的jars/目录中来修复这个错误。你也可以尝试在你的uber jar中为特定的依赖项(如Jackson)添加阴影。

6psbrbz9

6psbrbz93#

由于Spark已经发布了metrics-json jar,我们可以将作用域标记为已提供,这将解决冲突。

<!-- Metrics -->
    <dependency>
      <groupId>io.dropwizard.metrics</groupId>
      <artifactId>metrics-core</artifactId>
      <version>${metrics.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>io.dropwizard.metrics</groupId>
      <artifactId>metrics-json</artifactId>
      <version>${metrics.version}</version>
      <scope>provided</scope>
    </dependency>

相关问题