简体   繁体   English

Apache Spark-java.lang.NoClassDefFoundError

[英]Apache spark - java.lang.NoClassDefFoundError

I have maven based mixed scala/java application that can submit spar jobs. 我有基于Maven的混合scala / java应用程序,可以提交spar作业。 My application jar "myapp.jar" has some nested jars inside lib folder. 我的应用程序jar“ myapp.jar”在lib文件夹中有一些嵌套的jar。 one of which is "common.jar". 其中之一是“ common.jar”。 I have defined class-path attribute in Manifest file like Class-Path: lib/common.jar . 我已经在清单文件(如Class-Path: lib/common.jar定义了class-path属性Class-Path: lib/common.jar Spark executor throws java.lang.NoClassDefFoundError:com/myapp/common/myclass error when submitting application in yarn-client mode. 当以yarn-client模式提交应用程序时,Spark执行程序会引发java.lang.NoClassDefFoundError:com/myapp/common/myclass错误。 Class(com/myapp/common/myclass.class) and jar(common.jar) is there and nested inside my main myapp.jar. Class(com / myapp / common / myclass.class)和jar(common.jar)在那里并嵌套在我的主myapp.jar中。 Fat jar is created using spring-boot-maven plugin which nest other jars inside lib folder of parent jar. Fat jar是使用spring-boot-maven插件创建的,该插件将其他jar嵌套在父jar的lib文件夹中。 I prefer not to create shaded flat jar as that would create other issues. 我宁愿不要创建带阴影的扁平罐子,因为那样会造成其他问题。 Anyway spark executor jvm can load nested jars here? 无论如何,spark executor jvm可以在此处加载嵌套jar。

EDIT spark (jvm classloader) can find all the classes those are flat inside myapp.jar itself. EDIT spark(jvm classloader)可以在myapp.jar本身中找到所有平坦的类。 ie com/myapp/abc.class, com/myapp/xyz.class etc. 即com / myapp / abc.class,com / myapp / xyz.class等。

EDIT2 spark executor classloader can also find some classes from nested jar but it throws NoClassDefFoundError some other classes in same nested jar! EDIT2 spark executor类加载器也可以从嵌套jar中找到一些类,但是在同一嵌套jar中它会引发NoClassDefFoundError一些其他类! here's the error: 这是错误:

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

I do submit myapp.jar with sparkConf.setJar(String[] {"myapp.jar"}) and also tried setting it on spark.yarn.executor.extraClassPath 我确实使用sparkConf.setJar(String[] {"myapp.jar"})提交了myapp.jar,还尝试在spark.yarn.executor.extraClassPath上进行spark.yarn.executor.extraClassPath

EDIT 3 As a workaround, I extracted myapp.jar and set sparkConf.setJar(String[] {"myapp.jar","lib/common.jar"}) manually and error went away but obviously I have to do that for all the nested jar which is not desirable. 编辑3作为一种解决方法,我sparkConf.setJar(String[] {"myapp.jar","lib/common.jar"})提取了myapp.jar并设置sparkConf.setJar(String[] {"myapp.jar","lib/common.jar"}) ,错误消失了,但是显然我必须对所有人都这样做嵌套的罐子是不理想的。

You can use --jars options, to give comma separated list of jars while starting the Spark Application. 您可以使用--jars选项在启动Spark Application时以逗号分隔jar的列表。

Something like 就像是

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM