1

我有一个从 IntelliJ 内部运行的 scala spark 流应用程序。当我针对本地 [2] 运行时,它运行良好。如果我将 master 设置为 spark://masterip:port,则会出现以下异常:

java.lang.ClassNotFoundException: RmqReceiver

我应该补充一点,我在同一个名为 RmqReceiver 的项目中实现了一个自定义接收器。这是我的应用程序代码:

import akka.actor.{Props, ActorSystem}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkContext, SparkConf}

object Streamer {
  def main(args:Array[String]): Unit ={
    val conf = new SparkConf(true).setMaster("spark://192.168.40.2:7077").setAppName("Streamer")
    val sc = new SparkContext(conf)
    val ssc = new StreamingContext(sc, Seconds(2))
    val messages = ssc.receiverStream(new RmqReceiver(...))
    messages.print()
    ssc.start()
    ssc.awaitTermination()
  }
}

RmqReceiver 类与 Streamer 位于同一 scala 文件夹中。我知道将 spark-submit 与 --jars 用于依赖项可能会使这项工作。有没有办法从应用程序内部得到这个工作?

4

1 回答 1

2

要在独立的 Spark 集群上运行作业,它需要了解应用程序中使用的所有类。所以你可以在启动时将它们添加到 spark 类路径中,这很困难,我不建议你这样做。

您需要将您的应用程序打包为 uber-jar(将所有依赖项压缩到单个 jar 文件中),然后将其添加到 SparkConf jars。

我们使用 sbt-assembly 插件。如果您使用的是 maven,它具有与 maven 程序集相同的功能

val sparkConf = new SparkConf().
    setMaster(config.getString("spark.master")).
    setJars(SparkContext.jarOfClass(this.getClass).toSeq)

我不认为你可以从 Intellij Idea 中获取它,你绝对可以将它作为 sbt 测试阶段的一部分。

于 2014-10-16T19:04:48.217 回答