没有提交JAR的驱动程序类路径 - ClassNotFoundException

时间:2016-02-13 15:42:46

标签: scala apache-spark datastax datastax-enterprise

我有一个运行带有Spark 1.4.1的DataStax Enterprise 4.8的节点独立集群,我以这种方式向集群模式提交我的应用程序:

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的列表。这些应该如何进入类路径?

1 个答案:

答案 0 :(得分:0)

让所有驱动程序和执行程序访问依赖项的最简单方法是将它们全部打包在一个超级jar 中。

这是你的选择吗?

有很多选项可供选择。如果你正在使用sbt,sbt-assembly可能是最知道的。

如果您想使用分开的小罐子,SparkContext.addjar(path: String)可能就是您所需要的。您只需确保您的路径位于共享文件系统(例如,HDFS)上,或者位于群集中所有节点上通用/复制的本地目录中。