【问题标题】:Jackson conflicts in Apache Spark when used with Azure Java SDK与 Azure Java SDK 一起使用时,Apache Spark 中的 Jackson 冲突
【发布时间】:2022-01-17 16:07:23
【问题描述】:

Azure Synapse 发布运行时可用的 jars here。我目前正在使用 Apache Spark 3.1 运行时。

我的项目还依赖 azure-eventgrid 的 1.4.0 版本作为依赖项(它引入了 azure-core)。在 Synapse 上部署作业时出现以下错误。

作业在本地运行良好,但在 Synapse 上部署时却不行。

21/11/29 17:38:00 INFO ApplicationMaster:最终应用状态:FAILED, exitCode:15,(原因:用户类抛出异常: java.lang.LinkageError:包版本:jackson-annotations=2.10.0, 杰克逊核心=2.10.0,杰克逊数据绑定=2.10.0, jackson-dataformat-xml=2.12.5,jackson-datatype-jsr310=2.12.5, azure-core=1.19.0,排查版本冲突: https://aka.ms/azsdk/java/dependency/troubleshoot 在 com.azure.core.implementation.jackson.ObjectMapperShim.createXmlMapper(ObjectMapperShim.java:73) 在 com.azure.core.util.serializer.JacksonAdapter.(JacksonAdapter.java:81) 在 com.azure.core.util.serializer.JacksonAdapter.(JacksonAdapter.java:58) 在 com.azure.core.util.serializer.JacksonAdapter$SerializerAdapterHolder.(JacksonAdapter.java:113) 在 com.azure.core.util.serializer.JacksonAdapter.createDefaultSerializerAdapter(JacksonAdapter.java:122) 在 com.azure.identity.implementation.IdentityClient.(IdentityClient.java:100) 在 com.azure.identity.implementation.IdentityClientBuilder.build(IdentityClientBuilder.java:139) 在 com.azure.identity.ManagedIdentityCredential.(ManagedIdentityCredential.java:70) 在 com.azure.identity.DefaultAzureCredentialBuilder.getCredentialsChain(DefaultAzureCredentialBuilder.java:129) 在 com.azure.identity.DefaultAzureCredentialBuilder.build(DefaultAzureCredentialBuilder.java:123)com.xxxxxxxxxxx.$anonfun$sendEvents$1$adapted(xxxxxxxGridSender.scala:25) 在 scala.collection.immutable.List.foreach(List.scala:392) 在 xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx.sendEvents(xxxxxx.scala:25) 在 scala.collection.Iterator.foreach(Ite​​rator.scala:941) 在 scala.collection.Iterator.foreach$(Iterator.scala:941) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1429) 在 scala.collection.IterableLike.foreach(Ite​​rableLike.scala:74) 在 scala.collection.IterableLike.foreach$(IterableLike.scala:73) 在 scala.collection.AbstractIterable.foreach(Ite​​rable.scala:56) 在 xxxxxx.xxxxxx.xxxxxx.xxxxxx.runner.xxxxxx.xxxxxx(xxxxxx.scala:82) 在 xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx(xxxxxx.scala:61) 在 xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx.$anonfun$start$2(xxxxxx.scala:39) 在 scala.collection.TraversableLike$WithFilter.$anonfun$map$2(TraversableLike.scala:827) 在 scala.collection.Iterator.foreach(Ite​​rator.scala:941) 在 scala.collection.Iterator.foreach$(Iterator.scala:941) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1429) 在 scala.collection.IterableLike.foreach(Ite​​rableLike.scala:74) 在 scala.collection.IterableLike.foreach$(IterableLike.scala:73) 在 scala.collection.AbstractIterable.foreach(Ite​​rable.scala:56) 在 scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:826) 在 xxxxxx.xxxxxx.xxxxxx.xxxxxx.x.xxxxx.xxxxxx.start(xxxxxx.scala:36) 在 xxxxxx.xxxxxx.xxxxxx.xxxxxx.xxxxxx$.main(xxxxxx.scala:29) 在 xxxxxx.xxxxxx.aiops.xxxxxx.xxxxxx.main(xxxxxx.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:732) 引起:java.lang.NoSuchMethodError: com.fasterxml.jackson.dataformat.xml.XmlMapper.coercionConfigDefaults()Lcom/fasterxml/jackson/databind/cfg/MutableCoercionConfig; 在 com.fasterxml.jackson.dataformat.xml.XmlMapper.(XmlMapper.java:176) 在 com.fasterxml.jackson.dataformat.xml.XmlMapper.(XmlMapper.java:145) 在 com.fasterxml.jackson.dataformat.xml.XmlMapper.(XmlMapper.java:127) 在 com.fasterxml.jackson.dataformat.xml.XmlMapper.builder(XmlMapper.java:218) 在 com.azure.core.implementation.jackson.ObjectMapperFactory.createXmlMapper(ObjectMapperFactory.java:84) 在 com.azure.core.implementation.jackson.ObjectMapperShim.createXmlMapper(ObjectMapperShim.java:70) ... 45 更多

【问题讨论】:

    标签: azure scala apache-spark azure-synapse


    【解决方案1】:

    Synapse 有自己的 jar,作为其 runtime 的一部分。项目依赖项需要与运行时可用的 jar 兼容。

    这里有两个部分:

    1. Azure-core 进入 Jackson 依赖 2.12 系列。 Apache Spark 3.1 仍在 2.10 系列中。
    2. Azure-core 已在 synapse (1.16.0) 的类路径中可用。因此,任何引入的 azure lib(连同它一起,将 azure-core 作为依赖项)都需要与 azure-core 1.16.0 兼容

    为了修复 (1),我添加了以下内容:

    object DependencyOverrides {
    
      /**
       * We do not have any direct dependency on jackson. Spark relies on 2.10 series and Azure-core sdk has dependency on 2.12.
       * In order to resolve conflicts, we explicitly provide the jackson dependency here to 2.10.5
       */
      val jackson = Seq(
        "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.10.0",
        "com.fasterxml.jackson.core" % "jackson-core" % "2.10.0",
        "com.fasterxml.jackson.core" % "jackson-annotations" % "2.10.0",
        "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.0",
        "com.fasterxml.jackson.dataformat" % "jackson-dataformat-xml" % "2.10.0",
        "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % "2.10.0",
      )
    
      val others = Seq(
        "com.google.guava" % "guava" % "27.0-jre"
      )
    
      val all = jackson ++ others
    }
    

    并在 SBT 中覆盖上述依赖:

    dependencyOverrides ++= DependencyOverrides.all
    

    要修复(2),另外在上面的others中添加相关的jar:

      val others = Seq(
        "com.azure" % "azure-core" % "1.16.0",
        "com.azure" % "azure-core-http-netty" % "1.6.2",
        "com.google.guava" % "guava" % "27.0-jre"
      )
    

    就我而言,添加 azure-core 还不够。还必须添加 azure-core-http-netty 和 guava。

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多