spark-submit错误:ClassNotFoundException

时间:2017-06-21 19:07:44

标签: scala apache-spark spark-submit

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

但是罐子装在2.1.1和Scala 2.11.0中。

1 个答案:

答案 0 :(得分:2)

出现你刚刚开始使用Scala开发Spark应用程序,所以为了帮助你和其他未来的Spark开发人员,我希望能给你足够的步骤来开始与环境。

项目构建配置 - build.sbt

出现你使用多项目sbt构建,这就是你有两个build.sbt的原因。为了解决您的问题,我假装您没有使用这种先进的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 Connector和其他依赖项,这些依赖项也可以使用--packages--jars来定义(它们本身就有它们的优点和缺点)。

sbt package

最终target/scala-2.11/counter_2.11-0.1.0.jar的大小将比使用counter-assembly-0.1.0.jar构建的sbt assembly小得多,因为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. 当您在执行项目的项目中有一个Scala应用程序时,--class "Counter"会由{li>

    sbt package负责。你可以安全地跳过它。