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中。
答案 0 :(得分:2)
出现你刚刚开始使用Scala开发Spark应用程序,所以为了帮助你和其他未来的Spark开发人员,我希望能给你足够的步骤来开始与环境。
出现你使用多项目sbt构建,这就是你有两个build.sbt
的原因。为了解决您的问题,我假装您没有使用这种先进的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 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文件中的依赖项。这是预期和罚款。
在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
那就是它。
请注意:
--deploy-mode cluster
对于练习来说太先进了(让我们保持简单并在需要时将其恢复)
file://
使事情破裂(或至少是多余的)
--class "Counter"
会由{li> sbt package
负责。你可以安全地跳过它。