Scala spark提交错误:ClassNotFoundException
build.sbtScala spark提交错误:ClassNotFoundException,scala,apache-spark,spark-submit,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:_*) counter/build.sbt name := "counter" mainC
lazy val commonSettings = Seq(
organization := "com.me",
version := "0.1.0",
scalaVersion := "2.11.0"
)
lazy val counter = (project in file("counter")).
settings(commonSettings:_*)
counter/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])
跑
错误:
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)
有什么想法吗?谢谢
更新
我这里有问题。现在,我将jar复制到spark-2.1.0-bin-hadoop2.7/bin
中,然后运行/spark submit--class“Counter”-masterspark://10.1.204.67:6066 --部署模式群集file://Counter-assembly-0.1.0.jar
火花点火器总成为2.1.0
但是jar是在2.1.1和Scala 2.11.0中组装的。您似乎刚刚开始使用Scala开发Spark应用程序,因此,为了帮助您和其他未来的Spark开发人员,我希望为您提供足够的步骤来适应环境
项目生成配置-Build.sbt
似乎您使用了多项目sbt构建,这就是为什么您有两个build.sbt
s。为了解决您的问题,我会假装您不使用此高级sbt设置
您似乎使用了Spark Streaming,因此将其定义为依赖项(如libraryDependencies
)。您不必定义其他Spark依赖项(如Spark core
或Spark 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包
来构建一个可部署的Spark应用程序包,并最终Spark将其提交给Spark群集
您还不必为此使用sbt assembly
。我可以看到您使用Spark Cassandra连接器和其他依赖项,这些依赖项也可以使用--packages
或--jars
来定义(它们本身有其优缺点)
最终的target/scala-2.11/counter_2.11-0.1.0.jar
的大小将比使用sbt-assembly
构建的counter-assembly-0.1.0.jar
小得多,因为sbt-package
在单个jar文件中不包含依赖项。这是意料之中的事
提交Spark应用程序-Spark提交
在sbt包
之后,您应该在target/scala-2.11
中将可部署包作为counter-assembly-0.1.0.jar
您只需spark提交
,提交所需选项,在您的情况下,这些选项将是:
spark-submit \
--master spark://10.1.204.67:6066
target/scala-2.11/counter-assembly-0.1.0.jar
就这样
请注意:
--部署模式集群
对于本练习来说太高级了(让我们保持简单,并在需要时将其带回来)
文件://
使东西破碎(或至少是多余的)
--class“Counter”
由sbt包
在您执行的项目中有一个Scala应用程序时负责。你可以放心地跳过它
您似乎刚刚开始使用Scala开发Spark应用程序,因此,为了帮助您和其他未来的Spark开发人员,我希望为您提供足够的步骤来适应环境
项目生成配置-Build.sbt
似乎您使用了多项目sbt构建,这就是为什么您有两个build.sbt
s。为了解决您的问题,我会假装您不使用此高级sbt设置
您似乎使用了Spark Streaming,因此将其定义为依赖项(如libraryDependencies
)。您不必定义其他Spark依赖项(如Spark core
或Spark 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包
来构建一个可部署的Spark应用程序包,并最终Spark将其提交给Spark群集
您还不必为此使用sbt assembly
。我可以看到您使用Spark Cassandra连接器和其他依赖项,这些依赖项也可以使用--packages
或--jars
来定义(它们本身有其优缺点)
最终的target/scala-2.11/counter_2.11-0.1.0.jar
的大小将比使用sbt-assembly
构建的counter-assembly-0.1.0.jar
小得多,因为sbt-package
在单个jar文件中不包含依赖项。这是意料之中的事
提交Spark应用程序-Spark提交
在sbt包
之后,您应该在target/scala-2.11
中将可部署包作为counter-assembly-0.1.0.jar
您只需spark提交
,提交所需选项,在您的情况下,这些选项将是:
spark-submit \
--master spark://10.1.204.67:6066
target/scala-2.11/counter-assembly-0.1.0.jar
就这样
请注意:
--部署模式集群
对于本练习来说太高级了(让我们保持简单,并在需要时将其带回来)
文件://
使东西破碎(或至少是多余的)
--class“Counter”
由sbt包
在您执行的项目中有一个Scala应用程序时负责。你可以放心地跳过它
你试过将counter.scala重命名为counter.scala吗?@TomLous没有。我会的try@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
nottarget/scala-2.11/counter-assembly-0.1.0.ja