一、概述
Apache Doris 在其 2.1 版本中引入了一项重磅功能——Job Scheduler。这一功能标志着 Doris 具备了自主的任务调度能力,其调度的精准度更是可以达到秒级。这项新特性不仅能有效保障数据导入过程的完整性与一致性,还为用户提供了灵活、便捷的调度策略调整空间。更重要的是,它减少了 Doris 对外部调度系统的依赖,从而降低了系统整体的故障风险和运维复杂度,为广大 大数据 及数据仓库用户带来了更加统一和可靠的使用体验。
二、核心特点
Job Scheduler 功能拥有以下几个显著特点:
- 秒级精准调度:任务可以在指定的时间间隔内被精确调度,确保数据处理的高效性与及时性。其底层采用了时间轮算法,保障事件能够实现秒级触发的精度。
- 灵活的调度策略:提供了丰富的调度选项,支持按分钟、小时、天或周的间隔进行周期性调度。同时也支持一次性调度任务。对于周期性调度,用户还可以指定任务的开始时间和结束时间。
- 高性能执行模型:内部采用 Disruptor 实现高性能的生产者-消费者模型,最大化避免任务执行过程中的过载问题,保障系统稳定运行。
- 执行记录可追溯:Job Scheduler 会存储最近的 Task 执行记录(存储量可配置),用户可以通过简单的 SQL 命令轻松查看任务历史执行情况,确保操作过程透明、可追溯。
- 高可用与自恢复:依托于 Doris 自身成熟的高可用机制,Job Scheduler 能够轻松实现故障自恢复和高可用,进一步提升了作为独立调度系统的可靠性。
三、实战:创建并管理一次性调度任务
下面我们通过一个完整的例子,演示如何在特定时间点执行一次任务。
1. 创建一次性任务
使用 CREATE JOB 语句可以创建一个任务。以下示例创建了一个名为 once_job 的任务,它将在 2024-07-02 21:40:00 这个精确的时间点,执行一条将数据从 demo.sink 表插入到 demo.sink2 表的 SQL 语句。
CREATE JOB once_job ON SCHEDULE AT '2024-07-02 21:40:00' DO INSERT INTO demo.sink2 SELECT * FROM demo.sink;
执行成功后,命令行会返回确认信息。

| 关键参数说明: |
参数 |
描述 |
once_job |
任务的唯一名称。 |
AT ‘2024-07-02 21:40:00’ |
指定任务执行的具体时间点。 |
DO |
其后跟随需要执行的具体SQL语句。 |
2. 查看任务状态
我们可以通过查询内置的 jobs 表来查看任务的状态。使用 type=‘insert’ 条件可以筛选出所有数据插入类型的任务。
select * from jobs(“type“=“insert“);

从查询结果可以看到,刚刚创建的 once_job 任务当前状态为 RUNNING,意味着它已被调度器接收并等待在指定时间执行。
3. 暂停任务
如果需要在任务执行前临时中止它,可以使用 PAUSE JOB 命令。
PAUSE JOB WHERE jobname='once_job';

执行成功后,再次查询任务状态,会发现其状态已变为 PAUSED。

4. 恢复任务
被暂停的任务可以通过 RESUME JOB 命令恢复执行。
RESUME JOB where jobName= ‘once_job’;

恢复后,查询任务状态会显示其重新变为 RUNNING。
5. 验证任务执行结果
当系统时间过了预设的执行时间点(2024-07-02 21:40:00)后,我们再次查看任务状态。
select * from jobs(“type“=“insert“);

此时,任务状态已更新为 FINISHED,表示已成功执行。同时,可以检查目标表 demo.sink2,确认数据已经按预期插入。
6. 清理任务
任务执行完成后,如果不再需要,可以使用 DROP JOB 命令将其删除,以清理元数据。
DROP JOB where jobName='once_job';

通过以上步骤,我们完整演示了 Doris Job Scheduler 对一次性任务的创建、监控、生命周期管理(暂停/恢复)及清理流程。这极大地简化了原本需要依赖外部 数据库/中间件/技术栈 (如独立的调度系统)才能完成的定时ETL作业,为数据工程师提供了内置、高效的解决方案。想了解更多关于 Doris 或其他数据库的实战技巧,欢迎访问 云栈社区 进行交流探讨。