我需要在我的spark应用程序中运行时从jar文件中加载一个类(以后来沙箱)。为此,我使用URLClassLoader。
val loader = new URLClassLoader(Array(new URL(s"file:///$jarFilePath")), Thread.currentThread().getContextClassLoader)
appClass = loader.loadClass("com..myclass")
val app = appClass.newInstance().asInstanceOf[MyClass]
它可以工作,我可以从工人那里访问我班级的方法,但是当我尝试时 要在加载的类中设置spark Dstream管道,作业将失败 classloader无法找到scala匿名函数。
19:31:29.027 [task-result-getter-3] WARN org.apache.spark.scheduler.TaskSetManager - Lost task 0.0 in stage 3.0 (TID 3, localhost): java.lang.ClassNotFoundException:com.mycompany.simple.Simple$$anonfun$1
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:68)
...
我认为这应该是可能的,因为它类似于REPL的作用?类似的SO问题已经通过将jar文件添加到类路径中来解决(这也适用于我),但这不符合我的需要,因为我需要在类加载器中隔离类。任何提示将不胜感激。