Spark Streaming独立应用程序和依赖项

时间:2014-10-16 14:33:41

标签: apache-spark spark-streaming

我有一个scala spark流媒体应用程序,我从IntelliJ内部运行。当我对抗本地[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文件夹中。我知道使用带有--jars的spark-submit依赖关系可能会使这个工作。有没有办法从应用程序内部开始工作?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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