安排 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();
}