2016-01-06 5 views
0

Я довольно новичок в среде Scala. Я получаю ошибку deduplicate при попытке собрать работу Scala Spark с помощью соединителя DataStax. Я был бы признателен за любые советы относительно того, что может решить эту проблему.Ошибка сборки sbt с разъемом spark-cassandra

Моей система:

  • Последнего Scala (2.11.7), установленные с помощью варки
  • Последнего Спарк (2.10.5), установленного с помощью варки
  • Последней 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 
... 
+0

@jbrown спасибо за указателем, похоже, используя 'assemblyMergeStrategy' из [пример] (https://github.com/databricks/learning-spark/blob/master /build.sbt) исправляет эту проблему, но не разрешает мою общую проблему. – BobBrez

+0

Ну, проблема связана с тем, что 2 баночки в дереве зависимостей содержат один и тот же файл, например возможно, две разные зависимости используют разные версии одной и той же библиотеки, а конфликты означают, что sbt не знает, как автоматически решить проблему. Вот почему вы решаете с помощью стратегий слияния. Таким образом, вы все еще можете увидеть предупреждение (я забыл), но пока ваш проект компилируется и работает, вы должны быть в порядке. Я добавлю свою стратегию слияния в комментарий. – jbrown

+0

К сожалению, это отмечено как повторяющееся слишком нетерпеливо. Основной источник вашей проблемы, скорее всего, вы пытаетесь использовать разъем Cassandra для Spark 1.5.0, когда используете Spark 1.6.0. Пока нет разъема для 1.6.0. Также упоминается «последняя искра (2.10.5)», но такой искры нет. Вероятно, вы имеете в виду Spark для Scala 2.10.5, что также может противоречить вам с помощью Scala 2.11.7. Попробуйте 'scalaVersion: =" 2.10.5 "и' "искровое ядро"% "1.5.0" ', и у вас может не возникнуть проблема слияния. – sgvd

ответ

3

Как я вставил мой комментарий, это связано с SBT, не зная, как обращаться с дубликаты файлов. Это может быть вызвано двумя вашими зависимостями в зависимости от разных версий одной и той же библиотеки. Таким образом, вам нужно решить, какую стратегию использовать - проверьте документы сборки sbt, но это такие вещи, как «держать в первую очередь», «держать последний» и т. Д.

В качестве ссылки, вот мой блок стратегии слияния для искрового проекта с не слишком много зависимостей:

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"} 
}