sbt Assembly-Schattierung, um ein fettiges Glas zu erzeugen, das auf Spark läuft

9

Ich benutze SBT Assembly, um ein Fettglas zu schaffen, das auf Funken laufen kann. Abhängigkeiten von grpc-netty . Die Guava-Version von Spark ist älter als die, die von grpc-netty benötigt wird, und ich stolperte in diesen Fehler: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument . Ich konnte dies lösen, indem ich userClassPathFirst auf "spark" auf "true" setzte, aber zu anderen Fehlern führte.

Korrigiere mich, wenn ich falsch liege, aber von dem, was ich verstehe, sollte ich userClassPathFirst nicht auf true setzen müssen, wenn ich die Schattierung richtig mache. Hier ist, wie ich jetzt schattiere:

%Vor%

Was mache ich hier falsch und wie repariere ich es?

    
Kumar Bharath Prabhu 31.08.2017, 19:48
quelle

1 Antwort

3

Du bist fast da. Was shadeRule macht ist benennt Klassen Namen um, nicht Bibliotheksnamen:

  

Die Hauptregel ShadeRule.rename wird zum Umbenennen von Klassen verwendet. Alle Verweise auf die umbenannten Klassen werden ebenfalls aktualisiert.

Tatsächlich gibt es in com.google.guava:guava keine Klassen mit dem Paket com.google.guava :

%Vor%

Es sollte ausreichen, um Ihre Schattierungsregel zu ändern:

%Vor%

Sie müssen also userClassPathFirst nicht ändern.

Außerdem können Sie Ihre Schattierungsregel wie folgt vereinfachen:

%Vor%

Da org.apache.spark Abhängigkeiten provided sind, werden sie nicht in Ihr jar eingeschlossen und nicht schattiert (daher wird spark eine eigene nicht-schattierte Version von Guave verwenden, die es auf dem Cluster hat).

    
Nikolay Vasiliev 02.09.2017, 08:50
quelle