【问题标题】:spark-submit error: ClassNotFoundException火花提交错误:ClassNotFoundException
【发布时间】:2017-11-24 20:18:40
【问题描述】:

build.sbt

lazy val commonSettings = Seq(
    organization := "com.me",
    version := "0.1.0",
    scalaVersion := "2.11.0"
)

lazy val counter = (project in file("counter")).
    settings(commonSettings:_*)

计数器/build.sbt

name := "counter"
mainClass := Some("Counter")
scalaVersion := "2.11.0"

val sparkVersion = "2.1.1";

libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion % "provided";
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided";
libraryDependencies += "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided";

libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "2.0.2";
libraryDependencies += "org.apache.spark" %% "spark-streaming-kafka-0-8" % sparkVersion;

libraryDependencies += "com.github.scopt" %% "scopt" % "3.5.0";

libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.1";
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test";

mergeStrategy in assembly := {
  case PathList("org", "apache", "spark", "unused", "UnusedStubClass.class") => MergeStrategy.first
  case x => (mergeStrategy in assembly).value(x)
}

counter.scala:

object Counter extends SignalHandler
{
    var ssc : Option[StreamingContext] = None;
    def main( args: Array[String])

运行

./spark-submit --class "Counter" --master spark://10.1.204.67:6066 --deploy-mode cluster file://counter-assembly-0.1.0.jar

错误:

17/06/21 19:00:25 INFO Utils: Successfully started service 'Driver' on port 50140.
17/06/21 19:00:25 INFO WorkerWatcher: Connecting to worker spark://Worker@10.1.204.57:52476
Exception in thread "main" java.lang.ClassNotFoundException: Counter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:229)
    at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:56)
    at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)

有什么想法吗?谢谢

更新

我在Failed to submit local jar to spark cluster: java.nio.file.NoSuchFileException 遇到了问题。现在,我将jar复制到spark-2.1.0-bin-hadoop2.7/bin,然后运行./spark-submit --class "Counter" --master spark://10.1.204.67:6066 --deploy-mode cluster file://Counter-assembly-0.1.0.jar

火花簇是2.1.0的

但是 jar 是在 2.1.1 和 Scala 2.11.0 中组装的。

【问题讨论】:

  • 您是否尝试将 counter.scala 重命名为 Counter.scala?
  • @TomLous 不,我会尝试
  • @TomLous 刚才试过了,不行
  • 嗯,如果没有整个项目可用,很难说。虽然有一些小提示/不需要的建议(可能无济于事,但无论如何都在这里)。 1. 不要使用 scala 2.11.0,而是 2.11.11 2. 不要在 scala 中使用分号(非常 Java) 3. 为什么有 2 个 build.sbt 文件。这么小的项目1应该够了吧? 4. 在 src/main/scala/ 文件夹中重新组织您的代码 5. 不要使用 var(不是很 FP)。对不起,我帮不了你,但如果你可以通过 github 分享项目代码,或者我或其他人可以快速查看它吗?
  • 打赌这是因为你使用file://counter-assembly-0.1.0.jar而不是target/scala-2.11/counter-assembly-0.1.0.jar引用它时没有正确使用jar。换句话说,你从哪里开始spark-submit

标签: scala apache-spark spark-submit


【解决方案1】:

看来您刚刚开始使用 Scala 开发 Spark 应用程序,因此,我只是为了帮助您和其他未来的 Spark 开发人员,希望为您提供足够的步骤来开始使用环境。

项目构建配置 - build.sbt

看来您使用了多项目 sbt 构建,这就是为什么您有两个 build.sbts。为了解决您的问题,我假设您没有使用此高级 sbt 设置。

您似乎显示您使用 Spark Streaming,因此将其定义为依赖项(如 libraryDependencies)。您不必定义其他 Spark 依赖项(例如 spark-corespark-sql)。

你应该有build.sbt如下:

organization := "com.me"
version := "0.1.0"
scalaVersion := "2.11.0"
val sparkVersion = "2.1.1"
libraryDependencies += "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided"

构建可部署包

使用上面的build.sbt,您执行sbt package 来构建一个可部署的Spark 应用程序包,您最终将spark-submit 到一个Spark 集群。

您不必为此使用sbt assembly...。我可以看到您使用 Spark Cassandra 连接器和其他也可以使用 --packages--jars 定义的依赖项(它们本身各有优缺点)。

sbt package

最终target/scala-2.11/counter_2.11-0.1.0.jar 的大小将比您使用sbt assembly 构建的counter-assembly-0.1.0.jar 小得多,因为sbt package 不包含单个jar 文件中的依赖项。这是意料中的事。

提交 Spark 应用程序 - spark-submit

sbt package 之后,您应该将target/scala-2.11 中的可部署包设置为counter-assembly-0.1.0.jar

您应该只使用spark-submit 所需的选项,在您的情况下是:

spark-submit \
  --master spark://10.1.204.67:6066
 target/scala-2.11/counter-assembly-0.1.0.jar

就是这样。


请注意:

  1. --deploy-mode cluster 对于练习来说太高级了(让我们保持简单,并在需要时将其恢复)

  2. file:// 让事情变得糟糕(或者至少是多余的)

  3. --class "Counter"sbt package 处理,当您在项目中执行单个 Scala 应用程序时。您可以放心地跳过它。

【讨论】:

  • 谢谢。但是(1)在sbt package中运行counter_2.11-0.1.0.jartarget/scala-2.11; (2)counter_2.11-0.1.0.jar比counter-assembly-0.1.0.jar小很多; (3) 6066为休息端口; (4)我很想以集群模式将jar部署到远程spark集群。我一遍又一遍地阅读spark.apache.org/docs/latest/submitting-applications.html 并尝试但无法使其工作。
  • 改进了我的回答,以从上面的评论中回答您的问题。 “我真的很想以集群模式将 jar 部署到远程 spark 集群” 为什么?你能解释一下为什么你还没有使用client 模式spark-submited 应用程序时坚持使用cluster 吗?这是另一个问题,我们应该在结案后讨论它。你不觉得吗?
  • 我已经尝试过client mode,它工作正常。但我更喜欢集群模式并通过rest apis提交。请在此处查看我的更新stackoverflow.com/questions/44662751/…
  • 那么你的问题是关于spark-submit --deploy-mode cluster,不是吗?问题并不清楚。
  • 你可以去10.1.204.67:8080 把独立大师的web UI 的第一页截图吗?请在您的问题中包含屏幕截图。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-11-13
  • 2020-04-05
  • 2018-04-20
  • 2017-05-04
  • 2018-06-23
  • 2015-11-06
  • 1970-01-01
相关资源
最近更新 更多