2016-02-13 54 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。但你的建议只是一种解决方法。我想知道为什么我的方法不起作用。谢谢 –

相关问题