【问题标题】:java.lang.NoClassDefFoundError when running a spark jar application运行 spark jar 应用程序时出现 java.lang.NoClassDefFoundError
【发布时间】:2019-01-26 00:14:42
【问题描述】:

我编译了我的 Apache Spark 应用程序,该应用程序是在 IntellijIDEA 中使用 sbt 用 Scala 编写的,并且在 IntelliJ 中运行时运行良好。但是当我将它编译并打包为一个 jar 文件并在远程服务器上运行它时,当代码到达我尝试在 org/locationtech/jts/geom/Envelope 中创建一个 Envelope 实例的位置时,我得到了这个错误。 p>

Exception in thread "main" java.lang.NoClassDefFoundError: org/locationtech/jts/geom/Envelope
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethod(Class.java:2128)
at java.io.ObjectStreamClass.getPrivateMethod(ObjectStreamClass.java:1629)
at java.io.ObjectStreamClass.access$1700(ObjectStreamClass.java:79)
at java.io.ObjectStreamClass$3.run(ObjectStreamClass.java:520)...

我了解这是库版本不一致的问题,也知道NoClassDefFoundError表示该库在编译时可访问,在运行时不可访问,但我无法解决问题.

这是我的 build.sbt 文件:

name := "MySpark"
version := "0.1"
scalaVersion := "2.11.6"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.3.0", "org.locationtech.jts" % "jts-core" % "1.16.0" 
)

远程计算机上的 Spark 和 Scala 版本与 build.sbt 文件中的版本相同。

当我在 sbt shell 中运行 evicted 时,我得到了这个信息,但我不知道如何使用这个信息来解决我的问题。

[warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[warn]  * io.netty:netty:3.9.9.Final is selected over {3.6.2.Final, 3.7.0.Final}
[warn]      +- org.apache.spark:spark-core_2.11:2.3.0             (depends on 3.9.9.Final)
[warn]      +- org.apache.zookeeper:zookeeper:3.4.6               (depends on 3.6.2.Final)
[warn]      +- org.apache.hadoop:hadoop-hdfs:2.6.5                (depends on 3.6.2.Final)
[warn]  * commons-net:commons-net:2.2 is selected over 3.1
[warn]      +- org.apache.spark:spark-core_2.11:2.3.0             (depends on 2.2)
[warn]      +- org.apache.hadoop:hadoop-common:2.6.5              (depends on 3.1)
[warn]  * com.google.guava:guava:11.0.2 is selected over {12.0.1, 16.0.1}
[warn]      +- org.apache.hadoop:hadoop-yarn-client:2.6.5         (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-api:2.6.5            (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-common:2.6.5         (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-server-nodemanager:2.6.5 (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-yarn-server-common:2.6.5  (depends on 11.0.2)
[warn]      +- org.apache.hadoop:hadoop-hdfs:2.6.5                (depends on 11.0.2)
[warn]      +- org.apache.curator:curator-framework:2.6.0         (depends on 16.0.1)
[warn]      +- org.apache.curator:curator-client:2.6.0            (depends on 16.0.1)
[warn]      +- org.apache.curator:curator-recipes:2.6.0           (depends on 16.0.1)
[warn]      +- org.apache.hadoop:hadoop-common:2.6.5              (depends on 16.0.1)
[warn]      +- org.htrace:htrace-core:3.0.4                       (depends on 12.0.1)
[warn] Run 'evicted' to see detailed eviction warnings
[info] Here are other dependency conflicts that were resolved:
[info]  * com.thoughtworks.paranamer:paranamer:2.8 is selected over {2.6, 2.3}
[info]      +- com.fasterxml.jackson.module:jackson-module-paranamer:2.7.9 (depends on 2.8)
[info]      +- org.json4s:json4s-core_2.11:3.2.11                 (depends on 2.6)
[info]      +- org.apache.avro:avro:1.7.7 

【问题讨论】:

  • 你能发布你的 spark-submit 命令吗?
  • spark-submit --class labX.applications.ServerTest --executor-memory 2048m --executor-cores 1 --num-executors 17 mySparkApp_2.11-0.1.jar

标签: scala apache-spark sbt


【解决方案1】:

尝试使用--packages 将您的依赖项添加到您的spark-submit 命令中

spark-submit --packages org.locationtech.jts:jts-core:1.16.0 --class labX.applications.ServerTest --executor-memory 2048m --executor-cores 1 --num-executors 17 mySparkApp_2.11-0.1.jar

【讨论】:

    【解决方案2】:

    如果您运行 sbt package cmd,生成的 jar 将只包含您的源文件,但不包含 3rd 方库。

    因此,如果您部署 Jar 并尝试运行它。您的运行时环境必须提供此处指定的外部库

    libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "2.3.0", "org.locationtech.jts" % "jts-core" % "1.16.0" 
    )
    

    当您运行 Spark 应用程序时,"org.apache.spark" %% "spark-core" % "2.3.0" 存在于您的运行时环境类路径中。 spark-submit 将为您完成。 "org.locationtech.jts" % "jts-core" % "1.16.0" 是一个特定的 3rd 方库,默认情况下,我认为您的运行时环境不会包含它。

    你必须使用插件:

    • sbt 组装
    • sbt-onejar
    • sbt-native-packager

    并将其配置为包含您的第 3 方库。 因此,您的应用程序将根据所选解决方案附带必要的类。 在这种情况下,我强烈建议您将范围 provided 添加到运行时环境中已经存在的 spark 库中。它应该将它们从包中排除,并防止您的包与目标(运行时)环境中已经存在的内容之间的潜在冲突

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多