2016-02-13 132 views
1

我有一個獨立的節點集羣中運行DataStax企業4.8星火1.4.1,而我提出在集羣模式下我的應用程序是這樣的:驅動程序類路徑 - ClassNotFoundException的

dse spark-submit \ 
    --class MyApp \ 
    --master spark://MY-IP:6066 \ 
    --deploy-mode cluster \ 
    --packages LIST-OF-MY-DEPENDECIES \ 
    MyApp.jar 

這似乎爲它工作應該。它將所有傳遞依賴的JAR下載到本地Maven並啓動我的應用程序,但是這些JAR不在類路徑中。

object MyApp { 
    def main(args: Array[String]): Unit = { 
    // This fails with: ClassNotFoundException 
    getClass.getClassLoader.loadClass("akka.cluster.Cluster$") 
    } 
} 

我發現了類加載器(org.apache.spark.util.MutableURLClassLoader)及其父母包括由位於/usr/share/dse下DataStax只提供標準靜態JAR文件,但沒有我的依賴。

另一個發現是,名爲spark.jars的Spark配置屬性(以及系統屬性)包含這些JAR的列表。這些應該如何到達classpath?

回答

0

讓所有驅動程序和執行者訪問您的依賴關係的最簡單方法是將它們全部打包在一個超級罐子中。

這是您的選擇嗎?

很少有選項可以做到這一點。如果你使用sbt,那麼sbt-assembly可能是最知名的。

如果你想要與分開的小罐子,SparkContext.addjar(path: String)可能是你所需要的。您只需確保您的路徑位於共享文件系統(例如HDFS)上或跨羣集中所有節點通用/複製的本地目錄中。

+0

注意:我使用了第二種方法,所以讓我知道是否有問題,我可以仔細看看。 – marios

+0

Uber jar由於資源文件衝突而導致問題 - 覆蓋reference.conf並且變得相當大(100 + MB)。 SparkContext.addjar不能解決我的問題。主要方法的第一行需要類路徑上的JAR。但你的建議只是一種解決方法。我想知道爲什麼我的方法不起作用。謝謝 –

相關問題