【问题标题】:Apache spark - java.lang.NoClassDefFoundErrorApache 火花 - java.lang.NoClassDefFoundError
【发布时间】:2015-11-03 08:40:57
【问题描述】:

我有基于 maven 的混合 scala/java 应用程序,可以提交 spar 作业。我的应用程序 jar“myapp.jar”在 lib 文件夹中有一些嵌套的 jar。其中之一是“common.jar”。我在 Manifest 文件中定义了类路径属性,例如 Class-Path: lib/common.jar。 Spark 执行器在以 yarn-client 模式提交应用程序时抛出 java.lang.NoClassDefFoundError:com/myapp/common/myclass 错误。 Class(com/myapp/common/myclass.class) 和 jar(common.jar) 在那里并嵌套在我的主 myapp.jar 中。 Fat jar 是使用 spring-boot-maven 插件创建的,该插件将其他 jar 嵌套在父 jar 的 lib 文件夹中。我不喜欢创建带阴影的扁平罐子,因为这会产生其他问题。无论如何 spark executor jvm 可以在这里加载嵌套的 jars 吗?

EDIT spark(jvm 类加载器)可以找到 myapp.jar 本身内所有平坦的类。即 com/myapp/abc.class、com/myapp/xyz.class 等。

EDIT2 spark executor classloader 也可以从嵌套 jar 中找到一些类,但它会在同一个嵌套 jar 中抛出 NoClassDefFoundError 一些其他类! 这是错误:

Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, host4.local): java.lang.NoClassDefFoundError: com/myapp/common/myclass
    at com.myapp.UserProfileRDD$.parse(UserProfileRDDInit.scala:111)
    at com.myapp.UserProfileRDDInit$$anonfun$generateUserProfileRDD$1.apply(UserProfileRDDInit.scala:87)
    at com.myapp.UserProfileRDDInit$$anonfun$generateUserProfileRDD$1.applyUserProfileRDDInit.scala:87)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
    at org.apache.spark.storage.MemoryStore.unrollSafely(MemoryStore.scala:249)
    at org.apache.spark.CacheManager.putInBlockManager(CacheManager.scala:172)
    at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:79)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:242)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
    at org.apache.spark.scheduler.Task.run(Task.scala:64)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:203)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ClassNotFoundException: 
com.myapp.common.myclass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 14 more

我确实使用 sparkConf.setJar(String[] {"myapp.jar"}) 提交 myapp.jar 并尝试将其设置为 spark.yarn.executor.extraClassPath

编辑 3 作为一种解决方法,我提取了 myapp.jar 并手动设置了sparkConf.setJar(String[] {"myapp.jar","lib/common.jar"}) 并且错误消失了,但显然我必须对所有不可取的嵌套 jar 执行此操作。

【问题讨论】:

  • 谁反对它,请注意证明

标签: java scala jar apache-spark


【解决方案1】:

您可以使用 --jars 选项,在启动 Spark 应用程序时提供逗号分隔的 jar 列表。

类似

spark-submit --jars lib/abc.jar,lib/xyz.jar --class <CLASSNAME> myapp.jar

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多