任务调度系统在数据平台中算是非常核心的组件了。在日常的数据处理中,定时运行一些业务是很常见的事,比如定时从数据库将新增数据导入到数据平台,将数据平台处理后的数据导出到数据库或者是文件系统。
可以这么说,任务调度系统类似于军队的司令,指挥着数据平台上的各个组件的运行,时刻监督着任务的运行情况。
在数据平台里,有着另一种调度系统,称为资源调度系统。虽说都是调度,但是两者有本质的区别:
任务调度系统是一个简单又不简单的工具。说它简单,是因为相对于数据平台的计算引擎、存储系统等分布式系统,它的复杂度很低;说它不简单,是因为一个优秀的任务调度系统不仅需要和数据平台的各种组件对接,甚至还需要引入权限控制、监控报警,质量分析等功能。
现在市面上开源的任务调度系统可以参考https://github.com/pditommaso/awesome-pipeline和https://github.com/meirwah/awesome-workflow-engines,国产的调度系统也有阿里的TBSchedule、Easy Scheduler、腾讯的Lhotse、当当的elastic-job、唯品会的Saturn等。
最简单的任务调度系统莫过于Linux系统自带的crontab,使用简单,运行稳定,特别是crontab语法影响了后续所有的任务调度系统。但是在刚起步时使用crontab无可厚非,随着调度任务的增多,相互之间又有着依赖,crontab就远远满足不了开发的需求了。因此诞生了各种各样的开源或者自研的任务调度系统。
市面上的调度系统大致可以分为两类:定时分片类作业调度系统和DAG工作流类调度系统。
定时分片类作业调度系统主要时为了使得crontab可以运行在分布式系统环境下也就是定时任务的分布式管理和数据分片运行。
关注的点:
Elastic-Job、Easy Scheduler、
DAG工作流类调度系统,主要是解决crontab任务直接的依赖关系,也就是任务之间的依赖关系。那么作为DAG类工作流调度系统自然要有丰富灵活的任务触发机制,例如时间、外部任务完成度等。
Apache Airflow、Oozie、Azkaban
在数据平台中,因为背靠着分布式的计算引擎,任务的分片等功能往往是交由计算引擎实现;且数据平台内的
作业繁多,作业之间的流程依赖比较复,比如大数据开发平台的离线数仓报表处理业务,从数据采集,清洗,到各个层级的报表的汇总运算,到最后数据导出到外部业务系统,一个完整的业务流程,可能涉及到成百上千个相互交叉依赖关联的作业
因此DAG工作流类调度系统在数据平台中使用的更加广泛(也因为使用者更喜欢使用Declarative API,比如SQL这种,告诉平台要做什么,而不是要怎么做)。
当然这两类系统的并不是完全冲突的,都是crontab衍生出来的变体,但是从实现上来看,两者又有根本的冲突。定时分片类作业调度系统侧重于数据分片、负载均衡,DAG工作流类调度系统侧重于任务之间的依赖,这导致了在架构设计上的不同,进而影响到实现。
这两种任务调度系统的鸿沟至今还没看到一款软件能够弥补,不过就像计算引擎出现了Dataflow模型统一批处理和流处理,相信不久的将来也会有相应的理论和实现去弥补两类调度系统的差别。
参考文章: https://github.com/pditommaso/awesome-pipeline https://github.com/meirwah/awesome-workflow-engines https://blog.csdn.net/colorant/article/details/75090158 https://www.cnblogs.com/smartloli/p/4964741.html https://www.cnblogs.com/davidwang456/p/9057839.html