我正在开发一个让用户编写 DSLS 并在运行时将其作为我的 Type 实例加载的系统,这些可以应用于 RDD 之上。整个应用程序作为 spark-submit 应用程序运行,我使用 ScriptEngine 引擎编译用 Scala 本身编写的 DSL。每个测试在 SBT 和 IntelliJ 中都能正常工作。但是,在进行 spark-submit 时,我的 fat-jar 中可用的我自己的类型无法在 Script 中导入。我如下初始化脚本引擎。
val engine: ScriptEngine = new ScriptEngineManager().getEngineByName("scala")
private val settings: Settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
settings.usejavacp.value = true
settings.embeddedDefaults[DummyClass]
private val loader: ClassLoader = Thread.currentThread().getContextClassLoader
settings.embeddedDefaults(loader)
这似乎是火花提交期间类加载器的问题。但是我无法弄清楚为什么我自己的 jar 中的类型也有 spark-submit 的主程序在我的脚本中不可用的原因,该脚本是在同一个 JVM 中创建的。scala scala-compiler、scala-reflect 和 scala-library 版本是 2.11.8。一些帮助将不胜感激。