2017-08-31 7 views
9

J'utilise l'assemblage sbt pour créer un gros pot qui peut fonctionner sur étincelle. Avoir des dépendances sur grpc-netty. La version de goyave sur spark est plus ancienne que celle requise par grpc-netty et je rencontre cette erreur: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument. J'ai été capable de résoudre cela en définissant userClassPathFirst à true sur spark, mais conduit à d'autres erreurs.sbt assemblage ombrage pour créer un gros pot pour fonctionner sur étincelle

Corrigez-moi si je me trompe, mais d'après ce que je comprends, je ne devrais pas avoir à définir userClassPathFirst à true si je fais correctement l'ombrage. Voici comment je fais l'ombrage maintenant:

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.guava.**" -> "[email protected]") 
    .inLibrary("com.google.guava" % "guava" % "20.0") 
    .inLibrary("io.grpc" % "grpc-netty" % "1.1.2") 
) 

libraryDependencies ++= Seq(
    "org.scalaj" %% "scalaj-http" % "2.3.0", 
    "org.json4s" %% "json4s-native" % "3.2.11", 
    "org.json4s" %% "json4s-jackson" % "3.2.11", 
    "org.apache.spark" %% "spark-core" % "2.2.0" % "provided", 
    "org.apache.spark" % "spark-sql_2.11" % "2.2.0" % "provided", 
    "org.clapper" %% "argot" % "1.0.3", 
    "com.typesafe" % "config" % "1.3.1", 
    "com.databricks" %% "spark-csv" % "1.5.0", 
    "org.apache.spark" % "spark-mllib_2.11" % "2.2.0" % "provided", 
    "io.grpc" % "grpc-netty" % "1.1.2", 
    "com.google.guava" % "guava" % "20.0" 
) 

Qu'est-ce que je fais mal ici et comment puis-je le réparer?

Répondre

3

Vous y êtes presque. Qu'est-ce que shadeRule fait est qu'il renames class names, pas les noms bibliothèque:

The main ShadeRule.rename rule is used to rename classes. All references to the renamed classes will also be updated.

En fait, dans com.google.guava:guava il n'y a pas de cours avec le paquet com.google.guava:

$ jar tf ~/Downloads/guava-20.0.jar | sed -e 's:/[^/]*$::' | sort | uniq 
META-INF 
META-INF/maven 
META-INF/maven/com.google.guava 
META-INF/maven/com.google.guava/guava 
com 
com/google 
com/google/common 
com/google/common/annotations 
com/google/common/base 
com/google/common/base/internal 
com/google/common/cache 
com/google/common/collect 
com/google/common/escape 
com/google/common/eventbus 
com/google/common/graph 
com/google/common/hash 
com/google/common/html 
com/google/common/io 
com/google/common/math 
com/google/common/net 
com/google/common/primitives 
com/google/common/reflect 
com/google/common/util 
com/google/common/util/concurrent 
com/google/common/xml 
com/google/thirdparty 
com/google/thirdparty/publicsuffix 

Il devrait être suffisant pour changer votre règle d'ombrage à ceci:

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.common.**" -> -> "[email protected]") 
    .inLibrary("com.google.guava" % "guava" % "20.0") 
    .inLibrary("io.grpc" % "grpc-netty" % "1.1.2") 
) 

Vous n'avez donc pas besoin de modifier userClassPathFirst.

De plus, vous pouvez simplifier votre règle d'ombrage comme ceci:

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.common.**" -> -> "[email protected]").inAll 
) 

Depuis org.apache.spark dépendances sont provided, ils ne seront pas inclus dans votre bocal et ne seront pas ombrés (d'où l'étincelle va utiliser sa propre version sans ombre de goyave qu'il a sur le cluster).

+0

Merci Nikolay. Votre solution a fonctionné comme un charme! –

+0

@Kumar Bharath Prabhu Heureux que cela a aidé! –