2016-07-12 9 views
1

Ich habe eine Spark-Anwendung, die eine sbt-Datei hat, genau wie unten.
Es funktioniert auf meinem lokalen Rechner. Aber wenn ich es zu EMR Lauffunken 1.6.1 einreichen, ist ein Fehler aufgetreten wie unten:spark-core 1.6.1 & lift-json 2.6.3 java.lang.NoClassDefFoundError

java.lang.NoClassDefFoundError: net/liftweb/json/JsonAST$JValue 

I "sbt-Paket" bin mit Glas bekommen

Build.sbt:

organization := "com.foo" 
name := "FooReport" 

version := "1.0" 

scalaVersion := "2.10.6" 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.6.1" 
    ,"net.liftweb" % "lift-json_2.10" % "2.6.3" 
    ,"joda-time" % "joda-time" % "2.9.4" 
) 

Haben Sie eine Idee, was passiert?

Antwort

0

Ich habe eine Lösung gefunden und es funktioniert!

Das Problem war alles über sbt package, die nicht alle abhängigen Gläser enthält, um jar auszugeben. Um das zu überwinden, habe ich versucht sbt-assembly, aber ich habe viele "deduplizierte" Fehler, wenn ich es lief.

Immerhin kam ich zu diesem Blogpost, der alles klar machte.
http://queirozf.com/entries/creating-scala-fat-jars-for-spark-on-sbt-with-sbt-assembly-plugin

Um Spark-Jobs zu einem Spark-Cluster (via Funken abschicken) einreichen, Sie alle Abhängigkeiten enthalten müssen (außer Funken selbst) in dem Jar, sonst werden Sie nicht sein in der Lage, diese in Ihrem Job zu verwenden.

  1. Create "assembly.sbt" unter/Projektordner.
  2. Fügen Sie diese Zeile addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
  3. dann den assemblyMergeStrategy Code und fügen Sie ihn auf Ihrer build.sbt

assemblyMergeStrategy in assembly := { case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last case PathList("javax", "activation", xs @ _*) => MergeStrategy.last case PathList("org", "apache", xs @ _*) => MergeStrategy.last case PathList("com", "google", xs @ _*) => MergeStrategy.last case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last case PathList("com", "codahale", xs @ _*) => MergeStrategy.last case PathList("com", "yammer", xs @ _*) => MergeStrategy.last case "about.html" => MergeStrategy.rename case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last case "META-INF/mailcap" => MergeStrategy.last case "META-INF/mimetypes.default" => MergeStrategy.last case "plugin.properties" => MergeStrategy.last case "log4j.properties" => MergeStrategy.last case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }

Und laufen sbt assembly

Jetzt haben Sie eine dicke, fette Glas haben die hat alle Abhängigkeiten. Es könnte Hunderte von MB basierend auf abhängigen Bibliotheken sein. Für meinen Fall benutze ich Aws EMR, auf dem Spark 1.6.1 bereits installiert ist. Um auszuschließen, funken Kern lib von Ihrem jar können Sie „zur Verfügung gestellt“ Stichwort:

"org.apache.spark" %% "spark-core" % "1.6.1" % "provided" 

Hier ist die letzte build.sbt Datei:

organization := "com.foo" 
name := "FooReport" 

version := "1.0" 

scalaVersion := "2.10.6" 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.6.1" % "provided" 
    ,"net.liftweb" % "lift-json_2.10" % "2.6.3" 
    ,"joda-time" % "joda-time" % "2.9.4" 
) 

assemblyMergeStrategy in assembly := { 
    case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last 
    case PathList("javax", "activation", xs @ _*) => MergeStrategy.last 
    case PathList("org", "apache", xs @ _*) => MergeStrategy.last 
    case PathList("com", "google", xs @ _*) => MergeStrategy.last 
    case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last 
    case PathList("com", "codahale", xs @ _*) => MergeStrategy.last 
    case PathList("com", "yammer", xs @ _*) => MergeStrategy.last 
    case "about.html" => MergeStrategy.rename 
    case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last 
    case "META-INF/mailcap" => MergeStrategy.last 
    case "META-INF/mimetypes.default" => MergeStrategy.last 
    case "plugin.properties" => MergeStrategy.last 
    case "log4j.properties" => MergeStrategy.last 
    case x => 
    val oldStrategy = (assemblyMergeStrategy in assembly).value 
    oldStrategy(x) 
} 
Verwandte Themen