系统主要基于大数据离线调度的场景进行设计,同时借鉴elastic-job 的弹性调度与Quartz 的调度策略,以及众多其他的开源项目进而构建了基于DAG的分布式任务调度系统。
对标Apache DolphinScheduler
其实任务调度系统还有更多的开源项目,例如Quartz和Elastic-JOB、XXL-JOB等。没有列举到分享中也是因为他们和大数据体系的集成并不高。
图片来源于快手大数据的任务调度分享 这种场景下要面对的任务依赖非常的复杂,也是传统的基于时间的任务调度系统不能覆盖的范围。所以基于DAG的任务调度系统设计基本都是在大数据场景下完善成熟的。
一个成熟的基于DAG分布式的任务调度系统至少需要有以下的模块来构成、并且关联上元数据与hadoop集群才能够提供生产。 元数据与hadoop集群都是另一个系统的事情,这里不做叙述。
很多开发者对于DAG非常的熟悉,非常不理解为什么在任务调度领域会区分定时调度以及基于DAG的调度。不就是一个小功能特性吗?至于这么麻烦?
其实在一般的业务系统中构建依赖关系的确不难,但是在任务调度的领域还有一个不可忽视的变量---时间。它是一个需要预测未来的设计、尤其是其中的难点【跨周期的任务依赖】(跨周期例子:A->B,A的运行周期是每天执行一次,B的运行周期是每周一执行一次)
简单的说就是两个任务不在同一个时间维度,想让它们相互构建成一张DAG是非常困难的。
任务:用户在产品页面进行配置的结果、需要设定运行周期、周期用crontab表示
版本:任务的一个运行周期内只会有一个版本
实例:版本的某一时刻只会有一个实例在运行(保留运行记录与刷数历史)
表 : hive表、数仓的基础建设
分区:hive表的划分方式,一般实践中会根据时间进行分区
时间参数:动态的时间生成,搭配着hive表的时间分区和任务每天运行使用,
具体的作用和来源可以参考后续给出的详细设计文章
想知道更加详细的设计可以参考任务调度系统DAG设计
- 弹性调度:调度器高可用,任务会归属于多个调度器中的一个。当发生故障,会自动的转移到其他可用的调度器中 详细设计参考 弹性调度设计
- 灵活的DAG依赖体系:跨周期的任务依赖配置很方便
- 数据回填:当计算逻辑发生变化,可进行重新刷数来保证新老数据逻辑的一致性
- 任务失败重试、报警
- 任务执行过程可观测
- 多租户建设,资源可争抢。加强资源利用率:详细参考 多租户--资源体系建设
- web page
todo
(除UI与API外)各模块的详细设计参考下面的文档:
1.任务调度体系
2.任务执行架构设计
5.任务分级设计
6.监控报警
7.事件中心
8.日志服务