我有几个用Scala
编写Spark
大数据应用程序。这些应用程序的其他版本是用R
编写的。
我还有一个用Java
编写的Web服务器应用程序。这是作为 Web GUI 的 API 提供的。目的是使GUI能够执行这些应用程序并选择版本:R
或Spark
。我设法从Java
API 调用R
代码并将结果JSON
。但是现在执行Spark
程序似乎相当复杂。
到目前为止,我能够将其中一个Scala
.jar文件与Java
API 合并Maven
.为此,我将Spark
程序作为本地存储库放置在pom.xml
中,以便Scala
代码包含在最终的.jar包中。我还提到了Scala
和breeze
库作为pom.xml
中的依赖项。当我尝试使用 API 发送请求时,它当然会抛出一个错误,说java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
.至此,我意识到这是因为我没有在Maven
依赖项中提到Spark
库,但后来我认为我做错了,因为Spark
应用程序通常是通过在终端中执行spark-submit
命令来运行的。
所以现在我的想法是将Java
API .jar和Scala
.jar放在一个文件夹中,然后从 API .jar内部执行spark-submit
Java
,针对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.
}
}