首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Spark和whisklabs/docker解决SBT依赖问题

如何用Spark和whisklabs/docker解决SBT依赖问题
EN

Stack Overflow用户
提问于 2019-08-16 09:01:35
回答 1查看 545关注 0票数 0

我已经编写了一个星火结构流应用程序(我正在使用Scalasbt),现在我必须创建一个集成测试。不幸的是,我遇到了一个我无法解决的依赖问题。我用scala和sbt。

我的依赖性如下所示

代码语言:javascript
复制
  val xxxxxxx            = "xx.xxxx" %% "xxxx-xxxxxxx" %"x.x.x" % "test,it" embeddedExclusions
  val sparkCore          = "org.apache.spark" %% "spark-core" % "2.4.0" % "provided"
  val sparkStreaming     = "org.apache.spark" %% "spark-streaming" % "2.4.0" % "provided"
  val sparkSql           = "org.apache.spark" %% "spark-sql" % "2.4.0" % "provided"
  val sparkDse           = "com.datastax.dse" % "dse-spark-dependencies" % "6.7.2" % "provided" datastaxDseExclusions
  val sparkKafka         = "org.apache.spark" %% "spark-sql-kafka-0-10" % "2.4.0" % "provided" sparkExclusions
  // val jacksonDatabind = "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.6"

xxxxxxx依赖项来自公司,用于集成测试(提供cassandra容器等)。此依赖项的内部有以下依赖项:

代码语言:javascript
复制
    val dockerTestkit       = "com.whisk" %% "docker-testkit-scalatest" % "0.9.8"
    val dockerTestkitImpl   = "com.whisk" %% "docker-testkit-impl-spotify" % "0.9.8"
    val dockerTestkitConfig = "com.whisk" %% "docker-testkit-config" % "0.9.8"

我遇到的问题是org.apache.sparkcom.whisk中的com.whisk依赖关系。

  • org.apache.spark使用com.fasterxml.jackson版本2.6.7
  • com.whisk使用com.fasterxml.jackson版本2.9.5

第一方法:

我将com.fasterxml.jackson依赖项排除在org.apache.spark之外,然后得到:

代码语言:javascript
复制
[info]   ...
[info]   Cause: com.fasterxml.jackson.databind.JsonMappingException: Incompatible Jackson version: 2.9.5
[info]   at com.fasterxml.jackson.module.scala.JacksonModule$class.setupModule(JacksonModule.scala:64)
[info]   at com.fasterxml.jackson.module.scala.DefaultScalaModule.setupModule(DefaultScalaModule.scala:19)
[info]   at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:751)
[info]   at org.apache.spark.rdd.RDDOperationScope$.<init>(RDDOperationScope.scala:82)
[info]   at org.apache.spark.rdd.RDDOperationScope$.<clinit>(RDDOperationScope.scala)
[info]   at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
[info]   at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
[info]   at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:80)
[info]   at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:80)
[info]   at org.apache.spark.sql.cassandra.CassandraSourceRelation.insert(CassandraSourceRelation.scala:131)
[info]   ...

第二种方法:--我将com.fasterxml.jackson排除在xxxxxxx之外,然后得到:

代码语言:javascript
复制
[error] Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.deser.std.ReferenceTypeDeserializer
[error]     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[error]     at java.lang.ClassLoader.defineClass1(Native Method)
[error]     at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
[error]     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
[error]     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
[error]     at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
[error]     at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
[error]     at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
[error]     at java.security.AccessController.doPrivileged(Native Method)
[error]     at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[error]     at com.fasterxml.jackson.datatype.guava.GuavaModule.setupModule(GuavaModule.java:55)
[error]     at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:718)
[error]     at com.spotify.docker.client.ObjectMapperProvider.<clinit>(ObjectMapperProvider.java:74)
[error]     at com.spotify.docker.client.DockerConfigReader.<clinit>(DockerConfigReader.java:58)
[error]     at com.spotify.docker.client.auth.ConfigFileRegistryAuthSupplier.<init>(ConfigFileRegistryAuthSupplier.java:47)
[error]     at com.spotify.docker.client.DefaultDockerClient$Builder.build(DefaultDockerClient.java:3141)

我假设旧版本的com.fasterxml.jackson没有这个类。

问题

  • 有人知道我怎么能解决这个问题吗?
  • 是否有可能同时导入两个com.fasterxml.jackson依赖版本?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-20 06:18:10

我试过两种方法

1.方法:阴影显示xxxxxxx项目中的依赖项

我将程序集插件添加到plugin.sbt

  • addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")

并在build.sbt中添加了一些阴影规则。我为xxxxxxx项目创建了一个胖罐子

代码语言:javascript
复制
assemblyShadeRules in assembly := Seq(
  ShadeRule
    .rename("com.fasterxml.jackson.**" -> "embedded.com.fasterxml.jackson.@1")
    .inAll
)

那阴影起作用了。所有com.fasterxml.jackson依赖项都被重写为xxxxxxx项目中的embedded.com.fasterxml.jackson.*。(我解压缩罐子,解压缩类,看看发生了什么)

不幸的是,重写并没有解决root项目中的问题(我也不知道为什么)。所以我试着:

2.在中使用dependencyOverrides实现commonSettings

我向root项目添加了以下依赖项:

代码语言:javascript
复制
  val jacksonCore         = "com.fasterxml.jackson.core" % "jackson-core" % "2.9.6"
  val jacksonDatabind     = "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.6"
  val jacksonModule       = "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.6"

我没有排除com.fasterxml.jackson依赖项

  • 阿帕奇星火
  • 来自xxxxxxx

我在公共设置中添加了以下设置:

代码语言:javascript
复制
lazy val commonSettings = Seq(
  scalaVersion := library.version.scala,
    ...

  dependencyOverrides ++= Seq(
    library.jacksonDatabind,
    library.jacksonCore,
    library.jacksonModule
  ),

    ...
)

这起作用了,例外都消失了。不幸的是,我无法解释为什么这样做(和如何),为什么阴影不工作。:(

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57521738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档