2016-11-23 3 views
0

Я хочу работать с парсером lift-json, используя sbt built. Мой файл built.sbt имеет следующее содержание:sbt run работает, но ./spark-submit не

name := "MyProject" 

version := "1.0" 

scalaVersion := "2.10.0" 
// https://mvnrepository.com/artifact/net.liftweb/lift-json_2.10 
libraryDependencies += "net.liftweb" % "lift-json_2.10" % "3.0-M1" 
val lift_json = "net.liftweb" %% "lift-json_2.10" % "3.0-M1" 
//val json4sNative = "org.json4s" %% "json4s-native" % "3.3.0" 
//libraryDependencies += "org.scala-lang" % "scala-library" % "2.9.1" 
lazy val gitclonefile = "/root/githubdependencies/lift" 
lazy val g = RootProject(file(gitclonefile)) 
lazy val root = project in file(".") dependsOn g 

Мой код заключается в следующем: SBT пакет

package org.inno.parsertest 
import net.liftweb.json._ 
//import org.json4s._ 
//import org.json4s.native.JsonMethods._ 
object parser { 
    def main (args: Array[String]){ 
    val x = parse(""" { "numbers" : [1, 2, 3, 4] } """) 
    println(x) 
    val x1 = "jaimin is awesome" 
    println(x1) 
} 
} 

, а затем SBT запустить работы. но когда я хочу запустить это с помощью искрового представить, я получаю следующее сообщение об ошибке:

Error: application failed with exception 
java.lang.NoClassDefFoundError: net/liftweb/json/package$ 
    at org.inno.parsertest.parser$.main(jsonparser.scala:7) 
    at org.inno.parsertest.parser.main(jsonparser.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:367) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:77) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
Caused by: java.lang.ClassNotFoundException: net.liftweb.json.package$ 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 9 more 

Как я могу сделать ./spark-submit работу?

ответ

3

Как только искровой драйвер начинает работать над вашим приложением (когда вы его отправляете), он должен иметь дело с линией import net.liftweb.json._, что означает, что он будет искать этот класс в своем пути к классам.

Но Spark не поставляется с банкоматом с лифтом, поэтому это промах, и в итоге вы получите ClassNotFoundException.

Для этого вам необходимо предоставить необходимые банки. Для этого есть несколько способов, которые можно было бы обсудить.

Вы можете начать использовать spark documentation.

Bundling Your Application’s Dependencies
If your code depends on other projects, you will need to package them alongside your application in order to distribute the code to a Spark cluster. To do this, create an assembly jar (or “uber” jar) containing your code and its dependencies. Both sbt and Maven have assembly plugins. When creating assembly jars, list Spark and Hadoop as provided dependencies; these need not be bundled since they are provided by the cluster manager at runtime. Once you have an assembled jar you can call the bin/spark-submit script as shown here while passing your jar.

Можно предположить:

  1. Пакет ваше приложение, как то, что часто называют «убер банку» или «жир банку», с, например, sbt's "assembly" плагин, или maven shade, в зависимости от ваших предпочтений. Эта стратегия объединяет все классы и ресурсы всех зависимостей в одном JAR, который вы отправляете.

  2. Добавить аргументы в запрос искра-отправить. Существует несколько способов, но один из них - использовать аргумент --jars, а затем список разделенных запятыми файлов jar. Эти банки будут добавлены искрой к фактическому водителя/рабочий путь к классам перед запуском заданий

  3. Телль искровым представить «привязать» к хранилищу Maven

    Users may also include any other dependencies by supplying a comma-delimited list of maven coordinates with --packages. All transitive dependencies will be handled when using this command. Additional repositories (or resolvers in SBT) can be added in a comma-delimited fashion with the flag --repositories.

Но полное обсуждение все варианты являются довольно длинными, и я предлагаю вам «пакетные искровые приложения» Google или поиск StackOverflow с этими темами, чтобы получить лучший обзор.

Sidenote: отправка в Spark приложения, которое не использует SparkContext, кажется бессмысленным, но я думаю, вы просто экспериментируете на этом этапе.

+0

Эй, спасибо за такое объяснение. Я пытаюсь добавить -jars, чтобы сделать несколько банок, но нет другого баночка, кроме одного. Другая зависимость, которую я добавил, не создает никакой банки. Как добавить это в classpath или аргумент -jars –

+0

Что-то вроде 'spark-submit -master spark: // {Ваш мастер} - путь/в/ваш/liftweb.jar yourApp.jar yourClass'. Тот факт, что ваши зависимости не создает JAR, не имеет значения. Это (liftweb) банку существует где-то, и вы должны найти его :-). – GPI

+0

В моем каталоге проектов есть только один файл jar. –

Смежные вопросы