3

在我的公司,我们目前正在使用 Spark 解释器通过spark-jobserver动态生成类文件。这些类文件是在我们的 Spark 集群驱动程序上生成的,并保存到使用-Yrepl-outdir标准中的“”命令定义的目录(在该驱动程序上)中ScalaSettings。它代表了我们的执行程序的缓存,从那里加载类文件。

在标准设置下一切正常,每个驱动程序只有一个解释器,但是当我试图通过引入多个并行运行的解释器来提高性能时,就会出现问题。我使用 Akka 路由器设计模式,每个路由都有一个解释器,每个路由在自己的线程中运行,当然我碰壁了。即,这些解释器在评估类文件时在输出目录中覆盖彼此的结果。

我试图通过为每个解释器添加不同的输出目录来修复它,但在这种情况下,Spark 不会将这些输出目录识别为用于查找生成的类文件的目录。对于每个特定的解释器,我使用“ -Yrepl-outdir”命令定义了单独的输出目录,但不知何故这还不够。

我还尝试更改类加载器以修改那些生成的包/类的默认名称,每个包/类都以某些解释器唯一的前缀开头,但我还没有找到可行的解决方案。

由于要重现此问题,您需要运行 Spark 集群实例并以编程方式设置 Spark Scala 解释器,我将仅公开简化方法来展示我们生成的 Scala 解释器的一般情况:

  def addInterpreter(classpath: String, outputDir: File, loader: ClassLoader, conf: SparkConf): IMain = {
    val settings = new Settings()
    val writer = new java.io.StringWriter()
    settings.usejavacp.value = true
    settings.embeddedDefaults(loader)
    settings.classpath.value = (classpath.distinct mkString java.io.File.pathSeparator).replace("file:", "")

    SparkIMainServer.createInterpreter(conf, outputDir, settings, writer)
  }

在这里,您可以在左侧面板上看到我正在运行的解释器的一些简化输出,以及其中一个 ( $line3) 的内容。我认为可以解决我的问题的方法是为这些包提供自定义名称 - 而不是$line1, $line2, 等等类似的东西p466234$line1, p198934$line2,等等,每个解释器都有唯一的前缀。

在此处输入图像描述

那么,重命名由 Spark Scala 解释器生成的类文件/包的最简单方法是什么?这个问题还有其他解决方案吗?

4

0 回答 0