【问题标题】:sbt assembly failure with spark-cassandra-connector [duplicate]spark-cassandra-connector的sbt组装失败[重复]
【发布时间】:2016-01-07 01:48:34
【问题描述】:

我对 Scala 环境还很陌生。我在尝试使用 DataStax 连接器组装 Scala Spark 作业时收到 deduplicate 错误。如有任何建议可以解决此问题,我将不胜感激。

我的系统:

  • 通过 brew 安装的最新 Scala (2.11.7)
  • 通过 brew 安装的最新 Spark (2.10.5)
  • 通过 brew 安装的最新 SBT (0.13.9)
  • SBT Assembly 插件已安装

我的build.sbt

name := "spark-test"

version := "0.0.1"

scalaVersion := "2.11.7"

// additional libraries
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" %     "provided"
libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0-M3"

控制台:

$ sbt assembly
...
[error] 353 errors were encountered during merge
java.lang.RuntimeException: deduplicate: different file contents found in the following:
/Users/bob/.ivy2/cache/io.netty/netty-all/jars/netty-all-4.0.29.Final.jar:META-INF/io.netty.versions.properties 
... 

【问题讨论】:

  • @jbrown 感谢您的指点,看起来使用来自this exampleassemblyMergeStrategy 可以纠正这个问题,但不能解决我的整体问题
  • 好吧,问题是由于依赖关系树中的 2 个 jar 包含相同的文件,例如也许 2 个不同的依赖项使用同一个库的不同版本,并且冲突意味着 sbt 不知道如何自动解决问题。这就是您通过合并策略决定的地方。所以你可能仍然会看到一个警告(我忘了),但只要你的项目编译并工作,你应该没问题。我将在评论中添加我的合并策略。
  • 不幸的是,这被标记为重复太急切了。问题的主要来源很可能是您在使用 Spark 1.6.0 时尝试使用适用于 Spark 1.5.0 的 Cassandra 连接器。 1.6.0 还没有连接器。您还提到了“最新的 Spark (2.10.5)”,但没有类似的 spark 版本。您可能指的是 Scala 2.10.5 的 Spark,这也可能与您使用 Scala 2.11.7 冲突。试试scalaVersion := "2.10.5""spark-core" % "1.5.0",你可能不会再遇到合并问题了。

标签: scala apache-spark spark-cassandra-connector


【解决方案1】:

正如我在评论中所说,这是由于 sbt 不知道如何处理重复文件。这可能是由您的 2 个依赖项引起的,具体取决于同一库的不同版本。所以你需要决定使用什么策略 - 检查 sbt 汇编文档,但这些是“保持第一”、“保持最后”等内容。

作为参考,这是我的一个没有太多依赖项的 spark 项目的合并策略块:

assemblyMergeStrategy in assembly := {
  case x if x.endsWith(".class") => MergeStrategy.last
  case x if x.endsWith(".properties") => MergeStrategy.last
  case x if x.contains("/resources/") => MergeStrategy.last
  case x if x.startsWith("META-INF/mailcap") => MergeStrategy.last
  case x if x.startsWith("META-INF/mimetypes.default") => MergeStrategy.first
  case x if x.startsWith("META-INF/maven/org.slf4j/slf4j-api/pom.") => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    if (oldStrategy == MergeStrategy.deduplicate)
      MergeStrategy.first
    else
      oldStrategy(x)
}

// this jar caused issues so I just exclude it completely
assemblyExcludedJars in assembly := {
  val cp = (fullClasspath in assembly).value
  cp filter {_.data.getName == "jetty-util-6.1.26.jar"}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 2019-04-10
    • 2016-04-11
    • 2019-02-24
    • 2017-08-06
    • 2019-10-28
    • 2016-08-20
    • 2019-10-06
    相关资源
    最近更新 更多