我有一个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依赖关系可能会使这个工作。有没有办法从应用程序内部开始工作?
答案 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测试阶段的一部分。