调度Spark Job Java

时间:2016-10-05 08:52:28

标签: java hadoop apache-spark scheduled-tasks quartz-scheduler

我有一个Spark作业,它读取HBase表,一些聚合并将数据存储到mongoDB。目前,此作业使用spark-submit脚本手动运行。我想安排它以固定的间隔运行。

如何使用java实现此目的。

任何图书馆? 或者我可以在java中使用Thread吗?

任何建议都赞赏!

1 个答案:

答案 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)中使用简单的Datejava.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();
}