接口 | 描述 |
---|---|
SparkAppHandle | 运行Spark应用的句柄 |
SparkAppHandle.Listener | 获得句柄状态更新的监听器 |
类 | 描述 |
---|---|
AbstractLauncher |
启动器实现的基础类 |
InProcessLauncher | Spark应用的同进程(In-process)启动器 |
SparkLauncher | Spark应用的启动器 |
枚举 | 描述 |
---|---|
SparkAppHandle.State | 表示应用的状态 |
有两种方式使用这个库去启动应用,1. 作为一个子进程的话使用SparkLauncher 2. 在同一进程的话使用InProcessLauncher
AbstractLauncher.startApplication( org.apache.spark.launcher.SparkAppHandle.Listener...)方法可以被用来开始Spark并提供一个句柄去监控正在跑的应用:
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/app.jar")
.setMainClass("my.spark.app.Main")
.setMaster("local")
.setConf(SparkLauncher.DRIVER_MEMORY, "2g")
.startApplication();
// Use handle API to monitor / control application.
}
}
启动应用作为一个子进程的话要求一个完整的spark安装。这个安装字典能够被明确地在启动器配置里提供给启动器,或者通过配置SPARK_HOME环境变量。
在同进程中启动应用仅推荐使用在集群模式,Spark不能并行运行客户端模式的应用在同一个进程中。这个同进程启动器要求必要的Spark依赖(比如Spark-core和cluster manager-specific模块)去进行调用线程类的装载。
也可以启动一个原生的子进程,不使用额外的监控,使用SparkLauncher.launch()方法:
import org.apache.spark.launcher.SparkLauncher;
public class MyLauncher {
public static void main(String[] args) throws Exception {
Process spark = new SparkLauncher()
.setAppResource("/my/app.jar")
.setMainClass("my.spark.app.Main")
.setMaster("local")
.setConf(SparkLauncher.DRIVER_MEMORY, "2g")
.launch();
spark.waitFor();
}
}
这个方法要求调用代码去手动的管理子进程,包括输出流(提供可能的死锁)。推荐使用SparkLauncher.startApplication( org.apache.spark.launcher.SparkAppHandle.Listener...)来替代。