3

私の会社では現在、Spark インタープリターを使用して、spark-jobserverで動的にクラス ファイルを生成しています。-Yrepl-outdirこれらのクラス ファイルは、Spark クラスター ドライバーで生成され、標準の " " コマンドを使用して定義された (そのドライバーの) ディレクトリに保存されますScalaSettings。そこからクラスファイルをロードするエグゼキュータの一種のキャッシュを表します。

ドライバーごとに 1 つのインタープリターを使用する標準的なセットアップでは、すべて正常に動作しますが、並行して実行される複数のインタープリターを導入してパフォーマンスを改善しようとすると、問題が発生します。各ルートが独自のスレッドで実行される、ルートごとに 1 つのインタープリターを持つ 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)
  }

ここでは、実行中のインタープリターの簡略化された出力を、左側のパネルにパッケージが表示され、右側のパネルにそのうちの 1 つのコンテンツ ( $line3) が表示されます。私の問題を解決すると思うのは、これらのパッケージにカスタム名を付けることです- $line1, $line2、などの代わりに、p466234$line1, p198934$line2各インタープリターに一意のプレフィックスを付けます。

ここに画像の説明を入力

では、Spark Scala インタープリターによって生成されたクラスファイル/パッケージの名前を変更する最も簡単な方法は何ですか? この問題に対する他の解決策はありますか?

4

0 に答える 0