如何在提供 Scala .jar的 Java 中执行 spark-submit?



我有几个用Scala编写Spark大数据应用程序。这些应用程序的其他版本是用R编写的。

我还有一个用Java编写的Web服务器应用程序。这是作为 Web GUI 的 API 提供的。目的是使GUI能够执行这些应用程序并选择版本:RSpark。我设法从JavaAPI 调用R代码并将结果JSON。但是现在执行Spark程序似乎相当复杂。

到目前为止,我能够将其中一个Scala.jar文件与JavaAPI 合并Maven.为此,我将Spark程序作为本地存储库放置在pom.xml中,以便Scala代码包含在最终的.jar包中。我还提到了Scalabreeze库作为pom.xml中的依赖项。当我尝试使用 API 发送请求时,它当然会抛出一个错误,说java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$.至此,我意识到这是因为我没有在Maven依赖项中提到Spark库,但后来我认为我做错了,因为Spark应用程序通常是通过在终端中执行spark-submit命令来运行的。

所以现在我的想法是将JavaAPI .jar和Scala.jar放在一个文件夹中,然后从 API .jar内部执行spark-submitJava,针对Scala.jar。这甚至正确吗?以及如何从 Java 代码执行spark-submit?它是否必须使用此处提到的Runtime.exec()

SparkLauncher

可用于从Java Api代码提交Spark代码(用scala编写,预先编译的jarscala.jar放置在特定位置)。

用于使用 SparkLauncher 的 saprk 文档推荐以下方式从 Java 应用程序内部以语法方式提交 Spark 作业。在 Java API 代码中添加以下代码。

import org.apache.spark.launcher.SparkAppHandle;
import org.apache.spark.launcher.SparkLauncher;
public class MyLauncher {
public static void main(String[] args) throws Exception {
SparkAppHandle handle = new SparkLauncher()
.setAppResource("/my/scala.jar")
.setMainClass("my.spark.app.Main")
.setMaster("local")
.setConf(SparkLauncher.DRIVER_MEMORY, "2g")
.startApplication();
// Use handle API to monitor / control application.
}
}

最新更新