前言
在互联网领域中,几乎所有企业需要调度系统,主要原因是企业需要处理大量的数据,并且这些数据需要在不同的系统之间进行传输和处理。一部分是为了满足业务的需要,例如BI决策分析、图表展示、机器学习、数据挖掘;一部分是帮助这些企业协调和管理整个数据处理流程,从而提高整个系统的效率和可靠性。
故在大数据领域,调度系统是非常重要的,因为它能够管理和协调整个数据处理流程,确保任务按照正确的顺序和时间完成,从而支撑上游服务及产品的稳定性,可以说调度系统是企业产品中不可或缺的一部分。
一、调度系统发展史
在早期的大数据处理中,任务调度通常是手动进行的,需要人工监控和管理整个处理流程。这种方式非常耗时、容易出错,限制了大数据处理的规模和效率。
随着大数据技术的不断发展,人们开始意识到自动化调度的重要性,并开发了一些工具来简化调度流程。其中比较有代表性的是Apache Oozie,它是一种基于XML的工作流引擎,能够自动分配任务和资源,协调整个大数据处理流程。Oozie的出现极大地提高了大数据处理的效率和可靠性,也为后来的任务调度系统提供了重要的参考。
随着大数据技术的不断发展,任务调度系统也不断升级和完善。比较有代表性的任务调度系统包括Apache Airflow、Apache Falcon、国内的DolphinScheduler等。这些任务调度系统都具有高效、可靠、可扩展等特点,能够满足不同规模和复杂度的大数据处理需求。
此外,随着云计算的兴起,越来越多的企业开始将大数据处理任务迁移到云端,云厂商也开始提供各种大数据处理服务。例如,亚马逊的AWS Batch、谷歌的Cloud Scheduler和微软的Azure Scheduler等,这些服务通常都包含了强大的任务调度系统,能够帮助企业轻松地进行大数据处理。
据我了解国内的互联网公司一半选择开源项目、一半选择自研调度系统来支撑业务,关于为何选择自研,一方面是出于定制化考虑,一方面是出于2B企业用来提高产品竞争力从而选择自研,例如我所任职的公司便是自研调度系统用来提高商业产品的竞争力;但无论哪种方式调度系统已然成为了大数据处理的核心组件之一,为企业提供了高效、可靠和可扩展的数据处理服务。
二、调度系统常见分类
虽然市面上的调度系统有很多,但其核心的设计模式可以根据任务调度的粒度不同分为两种:
- DAG粒度调度
- 事件粒度调度
三、DAG调度
DAG粒度的调度是一种基于DAG任务依赖关系的调度方式,通常将任务组织成一个DAG工作流,通过定义工作流中任务的依赖关系,再通过广度或深度优先算法计算出任务的执行顺序,自动化地调度和执行。这种调度方式通常用于大规模数据处理流程中,例Spark的RDD任务调度,国内的DolphinScheduler便是基于这种设计思想实现。
在DAG粒度的调度中,任务的调度粒度是基于整个DAG图,即将整个DAG看作一个整体进行调度。这种调度方式可以最大程度地减少任务之间的依赖关系,提高整个系统的并行度和效率,如下图:
3.1、特点
在DAG调度中,任务的调度粒度通常是整个DAG图,而不是单个节点或者任务,故其血缘关系分为两种:
- DAG任务依赖
- DAG依赖
3.1.1、DAG任务依赖:
3.1.2、DAG依赖:
3.2、不足之处
首先,DAG调度系统具有更加静态的特点,DAG图中任务之间的依赖关系是固定的,所以调度粒度不够灵活;在DAG调度中,任务的调度粒度通常是整个DAG图,而不是单个节点或者任务,故以下两种场景无法支持:
- 任务触发DAG
- 任务触发DAG中的任务
3.2.1、任务触发DAG
DAG中某个任务触发另一个DAG,如下图:
3.2.2、任务触发DAG中的任务
DAG中某个任务触发另一个DAG中的任务并触发下游,如下图:
3.3、适用场景
基于DAG的调度系统适用于许多不同的场景和应用。以下是一些常见的使用场景:
- 数据处理:基于工作流的调度系统适用于大规模数据处理任务,例如ETL、数据仓库、数据分析等。这些任务通常需要对大量的数据进行处理,而且任务之间存在复杂的依赖关系,需要使用工作流来管理和调度任务。
- 机器学习:基于工作流的调度系统也适用于机器学习任务,例如深度学习、神经网络等。这些任务通常需要对大量数据进行训练和优化,而且任务之间存在复杂的依赖关系,需要使用工作流来管理和调度任务。
- 流程管理:基于工作流的调度系统也适用于流程管理任务,例如工作流程、业务流程等。这些任务通常需要对多个步骤进行管理和调度,而且任务之间存在复杂的依赖关系,需要使用工作流来管理和调度任务。
- 业务应用:基于工作流的调度系统也适用于许多业务应用场景,例如定时任务、报表生成、邮件发送等。这些任务通常需要按照一定的周期或者条件进行调度和执行,需要使用工作流来管理和调度任务。
3.4、数据库实现
DAG调度系统核心通常是6张表:
- DAG:DAG表
- DAG_RALANTION:DAG依赖关系表
- DAG_INSTANCE:DAG实例表
- TASK:任务表
- TASK_RELANTION:任务依赖关系表
- TASK_INSTANCE:任务实例表
3.5、总结
总之,DAG调度虽然具有很多优点,但也存在一些缺点。在实际应用中,需要根据具体业务需求和场景选择最合适的调度方式和算法。
四、事件调度
基于事件的调度是指以单个任务为基础进行调度,每个任务都独立执行,并且可以根据需要动态调整任务的执行顺序和优先级。这种调度模式的优点是可以灵活扩展至下游任务,根据任务的执行情况动态调整调度策略,提高任务的可扩展性。
4.1、特点
基于事件调度的调度系统灵活性更高,可以根据具体需求对任务节点进行调度和管理,实现动态调整和优化,可以解决DAG调度中不支持的两种场景,如下图各个任务之间相互依赖形成以点到面的发散状执行,可以任意扩展和添加,如下图:
4.2、适用场景
基于事件调度的调度系统常见于BI领域,如在BI产品中表的上下游依赖关系中,如下图:
- A,B,C系列总共8张表都是数仓中的物理表
- A表存在100条数据,A1表根据A表进行数据过滤生成A1表,A2表又根据A1表进行数据过滤生成A2表
- B系列以此类推
- C表则是根据A、B两种表Join生成,同时C1表根据C表数据过滤生成C1表。
按照上图需求,当A表数据发生变更后应该立即触发A1表和C表,从而保证A1、C表数据的准确性;如果我们使用DAG调度系统会出现三个DAG,如下:
在DAG调度系统中调度粒度是DAG,此时A表发生数据更改则只会触发DAG1,无法触发DAG3;
当然我们可以将C表加入到DAG1、DAG2中,如下图:
但这样设计会对其他DAG造成很强的侵入性,如果C表依赖10张表,则需要修改10张DAG;
而基于事件调度系统可以很好的支撑此场景,如下图:
A表执行结束后会根据下游依赖关系自动触发下游事件,依次执行保证了数据的实时性和准确性;
4.3、不足之处
- 处理复杂依赖关系时的效率问题:当任务之间存在复杂的依赖关系时,基于事件的调度系统可能会导致执行效率降低。
- 可重现性差:由于任务之间的执行顺序和优先级是动态调整的,因此在两次执行同一个作业时可能会得到不同的结果。
- 资源管理困难:由于每个任务都是独立的,需要单独调度和执行,可能会占用大量的计算资源,从而影响其他作业的正常执行。
4.4、数据库实现
基于事件调度系统的核心一般是三张表:
- TASK:任务表
- TASK_RELATION:任务依赖关系表
- TASK_INSTANCE:任务实例表
4.5、总结
基于事件调度虽然具有一些优点,但也存在一些不足之处,在选择调度系统时需要根据自己的业务需求和技术栈进行选择和权衡,以实现最优化的数据处理流程。
五、各自优劣
DAG调度系统的优劣
优势:
- 明确的任务依赖关系:DAG调度系统通过将任务组织成有向无环图,使任务之间的依赖关系更加直观和明确。
- 可重现的执行结果:由于任务按照固定顺序执行,DAG调度系统能够保证执行结果的一致性和可重现性。
- 可控的作业调度:DAG调度系统能够更好地管理作业调度,提高作业的可控性和稳定性。
劣势:
- 缺乏灵活性:DAG图中任务之间的依赖关系是固定的,执行过程中无法进行动态调整。
- 静态的特点:DAG调度系统不太适合处理动态变化和复杂的依赖关系。
- 限制可扩展性:当需要增加新任务时,可能需要重新设计整个DAG图,从而影响整个作业的执行效率。
基于事件调度系统的优劣
优势:
- 灵活的任务调度:在基于事件的调度系统中,每个任务都是独立的,可以根据需要动态调整任务的执行顺序和优先级。
- 动态特性:基于事件的调度系统更适合处理动态变化和复杂的依赖关系,能够灵活地处理新任务和依赖关系。
- 较为简单:基于事件的调度系统较为直接和简单,不需要复杂的图算法计算。
劣势:
- 处理复杂依赖关系时的效率问题:当任务之间存在复杂依赖关系时,基于事件的调度系统可能导致执行效率降低。
- 可重现性差:由于任务的执行顺序和优先级是动态调整的,两次执行同一个作业时可能会得到不同的结果。
- 资源管理困难:每个任务都是独立的,需要单独调度和执行,可能占用大量计算资源,影响其他作业的正常执行。
综述
DAG调度系统和基于事件的调度系统各有优缺点。在实际应用中,需要根据作业的特点和需求综合考虑,选择合适的调度系统。如果作业具有固定的任务依赖关系,并且需要精确控制和管理,则DAG调度系统可能是更好的选择;如果作业具有动态变化和复杂的任务依赖关系,并且需要更加灵活的调度方式,则基于事件的调度系统可能更为合适。