安排一个 Spark 作业 Java

4
我有一个Spark作业,它读取一个HBase表,进行一些聚合并将数据存储到MongoDB中。目前,这个作业是使用spark-submit脚本手动运行的。我希望能够按照固定的时间间隔来调度它。
我该如何使用Java实现这个功能呢?
是否有任何库可以使用?或者我可以在Java中使用线程来完成吗?
欢迎任何建议!

1
你可以使用 cron 来安排任务。 - Bhavesh
1个回答

4
如果你想继续使用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提供的简单的Timer和Date(java.util.TimerTask),但我更喜欢使用Quartz Job Scheduling Library——它真的很受欢迎(据我所知,Spring 也使用了Quartz Scheduler)。

Spring还提供了支持使用JDK 1.3自带的Timer以及Quartz Scheduler (http://quartz-scheduler.org) 的集成类来进行调度。

对于Quartz,您可以设置cron调度,对我来说更容易使用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 boot应用程序,你可以很容易地使用调度来运行一些方法 - 只需在配置中加上@EnableScheduling即可,类似于这样:

@Scheduled(fixedRate = 300000)
public void periodicalRunningSparkJob() {
    log.info("Spark job periodically execution");
    startApacheSparkApplication();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接