0

构建.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)
}

计数器.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 中组装的。

4

1 回答 1

3

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

项目构建配置 - build.sbt

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

似乎使用 Spark Streaming,因此将其定义为依赖项(as 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 连接器和其他依赖项,这些依赖项也可以使用--packagesor--jars来定义(它们本身有其优点和缺点)。

sbt package

final 的大小将比您使用的构建target/scala-2.11/counter_2.11-0.1.0.jar的要小得多,因为它不包含单个 jar 文件中的依赖项。这是预期的,很好。counter-assembly-0.1.0.jarsbt assemblysbt package

提交 Spark 应用程序 - spark-submit

sbt package您应该将可部署包保存target/scala-2.11counter-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 应用程序时会处理它。您可以安全地跳过它。

于 2017-06-21T23:17:20.367 回答