【问题标题】:Driver classpath without submitted JARs - ClassNotFoundException未提交 JAR 的驱动程序类路径 - ClassNotFoundException
【发布时间】:2016-05-24 17:40:03
【问题描述】:

我有一个运行 DataStax Enterprise 4.8 和 Spark 1.4.1 的节点独立集群,我以集群模式向它提交我的应用程序,如下所示:

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

【问题讨论】:

    标签: scala apache-spark datastax datastax-enterprise


    【解决方案1】:

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

    这适合你吗?

    执行此操作的选项很少。如果您使用的是 sbt,sbt-assembly 可能是最广为人知的。

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

    【讨论】:

    • 注:第二种方法我没用过,如果有问题请告诉我,我可以仔细看看。
    • Uber jar 由于资源文件冲突而存在问题 - 覆盖 reference.conf 并且变得非常大(100+MB)。 SparkContext.addjar 没有解决我的问题。 main 方法的第一行需要类路径上的 JAR。但是您的建议只是一种解决方法。我想知道为什么我的方法不起作用。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 2014-01-07
    • 1970-01-01
    • 2016-07-21
    • 2011-09-10
    • 2014-09-27
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多