我有一个Spark作业,它读取一个HBase表,进行一些聚合并将数据存储到MongoDB中。目前,这个作业是使用spark-submit脚本手动运行的。我希望能够按照固定的时间间隔来调度它。
我该如何使用Java实现这个功能呢?
是否有任何库可以使用?或者我可以在Java中使用线程来完成吗?
欢迎任何建议!
我该如何使用Java实现这个功能呢?
是否有任何库可以使用?或者我可以在Java中使用线程来完成吗?
欢迎任何建议!
spark-submit
,我更推荐使用crontab或类似的东西,并运行bash脚本。但是如果你需要从java运行"spark-submit",可以查看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.TimerTask
),但我更喜欢使用Quartz Job Scheduling Library——它真的很受欢迎(据我所知,Spring 也使用了Quartz Scheduler)。
只需添加Maven依赖。Spring还提供了支持使用JDK 1.3自带的Timer以及Quartz Scheduler (http://quartz-scheduler.org) 的集成类来进行调度。
对于Quartz,您可以设置cron调度,对我来说更容易使用Quartz。
<!-- 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 boot应用程序,你可以很容易地使用调度来运行一些方法 - 只需在配置中加上@EnableScheduling
即可,类似于这样:
@Scheduled(fixedRate = 300000)
public void periodicalRunningSparkJob() {
log.info("Spark job periodically execution");
startApacheSparkApplication();
}