2014-10-16 72 views
1

我有一個從IntelliJ內部運行的scala Spark應用程序。當我與本地運行[2]時,它運行良好。如果我設置主火花:// masterip:端口,然後我得到以下異常:Spark Streaming獨立應用程序和依賴關係

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類是在同一階的文件夾流光。我明白使用spark-submit和-jars來進行依賴關係可能會使這項工作成爲可能。有沒有什麼辦法可以在應用程序內部工作?

回答

2

要在獨立的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的它dp的,你絕對可以做到這一點作爲SBT測試階段的一部分。

+0

謝謝。這有幫助。你能否介紹一下sbt測試階段?這是否意味着在構建階段創建一個jar並在測試階段使用它?謝謝。 – ashic 2014-10-20 11:02:36

+0

@ashic我寫了一篇博文,如何在獨立集羣中運行Spark測試:http://eugenezhulenev.com/blog/2014/10/18/run-tests-in-standalone-spark-cluster/ – 2014-10-20 14:03:34

+0

awesome .. 。謝謝 :) – ashic 2014-10-20 14:15:09