安排 Spark 作业 Java
Scheduling a Spark Job Java
我有一个 Spark 作业,它读取 HBase table、一些聚合并将数据存储到 mongoDB。目前这项工作是 运行ning 手动使用 spark-submit 脚本。我想将它安排到 运行 固定的时间间隔。
如何使用 java 实现此目的。
有图书馆吗?
或者我可以用 java 中的 Thread 做到这一点吗?
感谢任何建议!
如果你还想使用 spark-submit
,我宁愿选择 crontab 或类似的东西,例如 运行 bash 脚本。
但是如果你需要从 java 运行 "spark-submit" 你可以看看 Package org.apache.spark.launcher。使用这种方法,您可以使用 SparkLauncher
.
以编程方式启动应用程序
import org.apache.spark.launcher.SparkAppHandle;
import org.apache.spark.launcher.SparkLauncher;
...
public void startApacheSparkApplication(){
SparkAppHandle handler = new SparkLauncher()
.setAppResource("pathToYourSparkApp.jar")
.setMainClass("your.package.main.Class")
.setMaster("local")
.setConf(...)
.startApplication(); // <-- and start spark job app
}
...
但是您的问题是关于某个调度库的。您可以使用 Timer
和 java 实用程序 (java.util.TimerTask
) 中提供的 Date
,但我更愿意使用 Quartz Job Scheduling Library - it is really popular (As I know spring uses Quartz Scheduler too).
Spring also features integration classes for supporting scheduling
with the Timer, part of the JDK since 1.3, and the Quartz Scheduler (
http://quartz-scheduler.org)
....
With Quartz you can set cron scheduling and for me it is more easier
to work with quartz.
添加maven依赖即可
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
创建 spark - Quartz 作业
public class SparkLauncherQuartzJob implements Job {
startApacheSparkApplication();
...
现在创建一个触发器并安排它
// trigger runs every hour
Trigger trigger = new Trigger()
.withIdentity("sparkJob1Trigger", "sparkJobsGroup")
.withSchedule(
CronScheduleBuilder.cronSchedule("0 * * * * ?"))
.build();
JobDetail sparkQuartzJob = JobBuilder.newJob(SparkLauncherQuartzJob.class).withIdentity("SparkLauncherQuartzJob", "sparkJobsGroup").build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(sparkQuartzJob , trigger);
不太可能 - 如果您有 spring 启动应用程序,您可以使用调度 运行 一些方法非常简单 - 只需 @EnableScheduling
配置和类似这样的东西:
@Scheduled(fixedRate = 300000)
public void periodicalRunningSparkJob() {
log.info("Spark job periodically execution");
startApacheSparkApplication();
}
我有一个 Spark 作业,它读取 HBase table、一些聚合并将数据存储到 mongoDB。目前这项工作是 运行ning 手动使用 spark-submit 脚本。我想将它安排到 运行 固定的时间间隔。
如何使用 java 实现此目的。
有图书馆吗? 或者我可以用 java 中的 Thread 做到这一点吗?
感谢任何建议!
如果你还想使用 spark-submit
,我宁愿选择 crontab 或类似的东西,例如 运行 bash 脚本。
但是如果你需要从 java 运行 "spark-submit" 你可以看看 Package org.apache.spark.launcher。使用这种方法,您可以使用 SparkLauncher
.
import org.apache.spark.launcher.SparkAppHandle;
import org.apache.spark.launcher.SparkLauncher;
...
public void startApacheSparkApplication(){
SparkAppHandle handler = new SparkLauncher()
.setAppResource("pathToYourSparkApp.jar")
.setMainClass("your.package.main.Class")
.setMaster("local")
.setConf(...)
.startApplication(); // <-- and start spark job app
}
...
但是您的问题是关于某个调度库的。您可以使用 Timer
和 java 实用程序 (java.util.TimerTask
) 中提供的 Date
,但我更愿意使用 Quartz Job Scheduling Library - it is really popular (As I know spring uses Quartz Scheduler too).
Spring also features integration classes for supporting scheduling with the Timer, part of the JDK since 1.3, and the Quartz Scheduler ( http://quartz-scheduler.org) ....
With Quartz you can set cron scheduling and for me it is more easier to work with quartz.
添加maven依赖即可
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
创建 spark - Quartz 作业
public class SparkLauncherQuartzJob implements Job {
startApacheSparkApplication();
...
现在创建一个触发器并安排它
// trigger runs every hour
Trigger trigger = new Trigger()
.withIdentity("sparkJob1Trigger", "sparkJobsGroup")
.withSchedule(
CronScheduleBuilder.cronSchedule("0 * * * * ?"))
.build();
JobDetail sparkQuartzJob = JobBuilder.newJob(SparkLauncherQuartzJob.class).withIdentity("SparkLauncherQuartzJob", "sparkJobsGroup").build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(sparkQuartzJob , trigger);
不太可能 - 如果您有 spring 启动应用程序,您可以使用调度 运行 一些方法非常简单 - 只需 @EnableScheduling
配置和类似这样的东西:
@Scheduled(fixedRate = 300000)
public void periodicalRunningSparkJob() {
log.info("Spark job periodically execution");
startApacheSparkApplication();
}