【发布时间】:2018-08-29 12:50:33
【问题描述】:
我正在开发一个允许用户编写 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)
这似乎是 spark-submit 期间类加载器的问题。但是我无法弄清楚为什么我自己的 jar 中的类型也有 spark-submit 的主程序在我的脚本中不可用的原因,该脚本是在同一个 JVM 中创建的。 scala scala-compiler、scala-reflect 和 scala-library 版本是 2.11.8。一些帮助将不胜感激。
【问题讨论】:
-
我使用
ScriptEngineManager的目的与您相同。基本上,我想在初始化SparkSession之前解释 DSL 命令。之后,我得到了包装命令功能的类,然后将其应用于RDDs。我的问题是,当我初始化SparkSession时,我得到了这个异常:java.lang.RuntimeException: class org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback not org.apache.hadoop.security.GroupMappingServiceProvider。你有同样的例外吗? -
您是否使用 spark-submit 来启动您的应用程序?
标签: apache-spark classloader spark-submit scriptengine scala-script