我有一个Spark作业,它读取HBase表,一些聚合并将数据存储到mongoDB。目前,此作业使用spark-submit脚本手动运行。我想安排它以固定的间隔运行。
如何使用java实现此目的。
任何图书馆? 或者我可以在java中使用Thread吗?
任何建议都赞赏!
答案 0 :(得分:3)
如果您仍想使用spark-submit
,我宁愿选择 crontab 或类似内容,也可以运行bash脚本。
但是如果你需要运行" spark-submit"从java你可以看看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
}
...
但你的问题是关于一些调度库。您可以在java util(Timer
)中使用简单的Date
和java.util.TimerTask
,但我更喜欢使用Quartz Job Scheduling Library - 它真的很受欢迎(据我所知春天{ {3}})。
Spring还具有支持调度的集成类 使用Timer,自1.3以来的JDK的一部分,以及Quartz Scheduler( uses Quartz Scheduler too) ....
使用Quartz你可以设置cron调度,对我来说它更容易 与石英合作。
只需添加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 job
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);
不太可能 - 如果您有弹簧启动应用程序,您可以使用调度来非常轻松地运行某些方法 - 只需@EnableScheduling
配置,如下所示:< / p>
@Scheduled(fixedRate = 300000)
public void periodicalRunningSparkJob() {
log.info("Spark job periodically execution");
startApacheSparkApplication();
}