2016-07-12 10 views
1

У меня есть приложение Spark, которое имеет sbt-файл, как показано ниже.
Он работает на моей локальной машине. Но когда я представить его ЭМИ запущенной Спарк 1.6.1, произошла ошибка, как показано ниже:spark-core 1.6.1 & lift-json 2.6.3 java.lang.NoClassDefFoundError

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

Я использую "SBT-пакет", чтобы получить Jar

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

У вас есть представление о том, что происходит?

ответ

0

Я нашел решение, и оно работает!

Проблема была в том, что около sbt package, которая не включает все зависимые баночки в выходной бачок. Чтобы преодолеть это, я попробовал sbt-assembly, но у меня было много ошибок «deduplicate», когда я его запускал.

В конце концов я подошел к этому сообщению в блоге, которое сделало все ясно.
http://queirozf.com/entries/creating-scala-fat-jars-for-spark-on-sbt-with-sbt-assembly-plugin

Для того, чтобы представить работу искры искрового кластер (с помощью искры подати), вам необходимо включить все зависимость (кроме Спарка самого) в Jar, в противном случае вы не будете в состоянии использовать их в своей работе.

  1. Создать "assembly.sbt" в/папке проекта.
  2. Добавьте эту строку addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
  3. Затем вставьте код assemblyMergeStrategy ниже вашего 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) }

И запустить sbt assembly

Теперь у вас есть большая толстая банка, который имеет все зависимости. Это может быть сотни МБ на основе зависимых библиотек. Для моего случая я использую Aws EMR, который Spark 1.6.1 уже установлен на нем. Чтобы исключить искровым ядро ​​экспромты из кувшина твоего, вы можете использовать «при условии» ключевое слово:

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

Вот окончательный build.sbt файл:

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