返回介绍

11.7 Job 调度

发布于 2025-04-22 19:57:21 字数 2315 浏览 0 评论 0 收藏

应用程序通常需要调度和执行任务,这些任务可能是发送一封 Email 或运行一个耗时的批量处理程序。 Job Schedulers 是一类提供这种功能的软件。你可能已经知道,这类产品有很多,包括通用的 UNIX cron 工具甚至更复杂的开源和商业产品,如 Quartz、Control-M 与 Autosys。Spring 提供多种 Job 调度方式,包括 JDKTimer、集成 Quartz 以及 Spirng 自带的 TaskScheduler。本节介绍如何使用 Quartz 与 Spring 的 TaskScheduler 来调度和执行 Hadoop 应用程序。

11.7.1 使用 TaskScheduler 调度 MapReduce Job

在这个示例中,我们会在之前开发的应用程序中加上任务调度的功能,用来执行 HDFS 脚本以及 wordcount 的 MapReduce Job。Spring 的 TaskScheduler 和 Trigger 接口可对将要运行的任务进行调度。Spring 提供了一些实现,常见的选择为 ThreadPoolTaskScheduler 和 CronTrigger。我们可以使用 XML 命名空间加上一个基于注解的编程模型将任务设置为由触发器进行调度。

在示例 11-32 的配置中,我们使用 XML 命名空间,它会调用任意由 Spring 管理的对象的方法,在这个案例中也就是 JobRunner 实例的 call 方法。触发器是一个 cron 表达式,它会从第 3 秒开始,每隔 30 秒触发一次。

示例 11-32 定义 TaskScheduler 来执行 HDFS 脚本以及 MapReduce Job

P191b

P192a

JobRunner 的 run-at-startup 元素的默认值是 false,因此在这个配置中,不会在应用程序启动的时候执行 HDFS 脚本与 Hadoop Job。使用这个配置能够让调度器成为系统中唯一负责执行脚本和 Job 的组件。

这个示例应用程序位于目录 hadoop/scheduling。在执行这个应用程序时,可以看到如示例 11-33 所示的(被截断的一部分)输出,其中时间戳符合 cron 表达式的定义。

示例 11-33 调度 wordcount 应用程序的输出

P192b

正如你所见,task 的命名空间非常易于使用,但是它也有许多功能(在这里我们将不涉及这些功能)与线程池策略有关或者委托给 CommonJ WorkManager 代理。Spring 框架的参考文档( http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html )详细说明了这些特性。

11.7.2 使用 Quartz 调度 MapReduce Job

Quartz( http://quartz-scheduler.org/ )是一个广受欢迎的开源任务调度框架,具有许多高级功能,如集群。在这个示例中,我们将之前示例所使用的 Spring TaskScheduler 替换成 Quartz。Quartz 调度要求定义 Job(即 JobDetail)、Trigger 以及 Scheduler,如示例 11-34 所示。

示例 11-34 定义 Quartz 调度来执行 HDFS 脚本和 MapReduce Job

P193

Quartz 的 JobDetail 类封装了满足触发条件时要执行的程序。Spring 的辅助类 MethodInvokingJobDetailFactoryBean 会建立一个 JobDetail 对象,它的功能是调用 Spring 管理对象中的指定方法。这个应用程序位于目录 hadoop/scheduling-quartz。程序的执行结果与基于 Spring TaskScheduler 示例所得到的结果类似。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。