【发布时间】:2020-03-10 05:51:06
【问题描述】:
在 Spark 应用程序 (v2.3.3) 中,我想使用 Scala 测试中的 Wiremock。我使用以下依赖项:
"org.apache.spark" %% "spark-sql" % "2.3.3" % "provided"
"org.apache.spark" %% "spark-mllib" % "2.3.3" % "provided"
"com.github.tomakehurst" % "wiremock" % "2.25.1" % Test
"org.scalatest" %% "scalatest" % "2.2.5" % Test
这样做,火花类出现以下错误:
java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:312)
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:200)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:46)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1.apply(RDD.scala:962)
at org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1.apply(RDD.scala:958)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
at org.apache.spark.rdd.RDD.withScope(RDD.scala:363)
at org.apache.spark.rdd.RDD.toLocalIterator(RDD.scala:958)
如果我从 Wiremock 中排除番石榴:
"com.github.tomakehurst" % "wiremock" % "2.25.1" % Test exclude("com.google", "guava")
我使用 Wiremock 得到以下信息:
java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
因为默认 guava 版本是 11.0.2 。
使用引入createStarted方法的guava 18,我仍然有错误tried to access method com.google.common.base.Stopwatch.<init>。
所以问题是 2 个库使用不兼容的 Guava 版本。如何解决?我找到的解决方案与 uber-jar 有关,但在我的情况下,这只是 在测试范围内。
【问题讨论】:
-
如何解决?要求您使用的库的维护者将他们的 Guava 版本更新到最新版本,并使用这些库的最新版本。
-
我在 Google 平台上使用 Spark,我无法选择可用的版本。
-
Wiremock 2.25.1 依赖于 Guava 20(一个 3 岁的版本),Spark 2.4.4 依赖于 Guava 14(一个 6.5 岁的版本),但他们说 cmets 中的 15(一个 6 岁的版本)版本)。两者都需要更新。欢迎来到依赖地狱!由于它们没有在同一范围内使用,所以我现在只删除wiremock。
-
...如果可以的话,我会...但我需要 Wiremock
标签: apache-spark sbt guava wiremock