【问题标题】:sbt run works but ./spark-submit does notsbt run 有效,但 ./spark-submit 无效
【发布时间】:2016-11-23 10:29:42
【问题描述】:

我想使用内置 sbt 的 lift-json 解析器。我的built.sbt 文件内容如下:

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

我的代码是这样的:

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 package 然后 sbt run 工作。但是当我想使用 spark-submit 运行它时,我收到以下错误:

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 工作?

【问题讨论】:

    标签: apache-spark sbt


    【解决方案1】:

    只要 spark 驱动程序开始在您的应用上运行(当您提交它时),它就必须处理 import net.liftweb.json._ 行,这意味着它会在其类路径中查找此类。

    但是 Spark 不附带 liftweb 的 jar,所以这是一个失误,你最终会得到一个 ClassNotFoundException

    因此,您需要为您的应用程序提供所需的 jar。有几种方法,详细讨论,可以做到这一点。

    您可以从 spark documentation 开始。

    捆绑应用程序的依赖项
    如果您的代码依赖于其他项目,则需要将它们与您的应用程序一起打包,以便将代码分发到 Spark 集群。为此,请创建一个包含您的代码及其依赖项的程序集 jar(或“uber”jar)。 sbt 和 Maven 都有汇编插件。创建程序集 jar 时,将 Spark 和 Hadoop 列为提供的依赖项;这些不需要捆绑,因为它们是由集群管理器在运行时提供的。一旦你有一个组装好的 jar,你可以在传递你的 jar 时调用 bin/spark-submit 脚本,如下所示。

    有人可能会建议:

    1. 将您的应用程序打包为通常称为“uber jar”或“fat jar”的东西,例如sbt's "assembly" 插件或maven shade,取决于您的偏好。此策略将所有依赖项的所有类和资源合并到一个 JAR 中,即您提交的那个。

    2. 向 spark-submit 调用添加参数。有几种方法,一种简单的方法是使用--jars 参数,然后是您需要的(逗号分隔的)jar 文件列表。在启动您的作业之前,这些 jar 将通过 spark 添加到实际的驱动程序/工作程序类路径中

    3. 告诉 spark-submit “绑定”到 maven 存储库

      用户还可以通过使用 --packages 提供逗号分隔的 maven 坐标列表来包含任何其他依赖项。使用此命令时将处理所有传递依赖项。可以使用 --repositories 标志以逗号分隔的方式添加其他存储库(或 SBT 中的解析器)。

    但是对所有选项的完整讨论是一个相当长的讨论,我建议您在 Google 上搜索“打包 spark 应用程序”或搜索 StackOverflow 以及这些主题以获得更好的概览。

    旁注:向 Spark 提交一个不使用 SparkContext 的应用似乎毫无意义,但我猜你现在只是在试验。

    【讨论】:

    • 嘿,谢谢你的解释。我正在尝试添加 --jars 以使多个 jar 运行,但除了一个之外没有其他 jar。我添加的另一个依赖项没有创建任何 jar。如何将其添加到类路径或 --jars 参数
    • 类似spark-submit --master spark://{Your Master} --jars path/to/your/liftweb.jar yourApp.jar yourClass。您的依赖项不创建 JAR 的事实是无关紧要的。这个(liftweb)jar 存在于某个地方,你必须找到它:-)。
    • 我的项目目录中只有一个jar文件。
    • 当然。但是你的 sbt 文件有 libraryDependencies += "net.liftweb" % "lift-json_2.10" % "3.0-M1" 所以你必须有一个包含一个名为 lift-json_2.10-3.0-M1.jar 的 jar 的存储库(或者 ~/.m2/repository/net.liftweb,或者 ~/.ivy2/cache/xxx...)。这是您必须复制的路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多