一种分布式作业调度方法和系统的制作方法
【技术领域】
[0001]本发明涉及数据分析技术,更具体地说,涉及一种分布式作业调度方法和系统。
【背景技术】
[0002]ETL(Extract-Transform-Load)用来描述将数据从来源端经过摘取(^Extract)、清洗(Cleaning)、转换(Transform)、装载(Load)至目的端的过程。其为构建数据仓库的重要一环,用户从数据源摘取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。
[0003]Quarz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是一个完全由java编写的开源作业调度框架。
[0004]Job是ETL的一个处理步骤,可能是清洗、加载或者转换,也可能是PI加工。作业是ETL的一个处理过程,由一组存在并行或串行执行顺序的Job组成。
[0005]ETL主要用于数据分析类项目,一般处理周期性(按小时、天、周、月、年等周期)作业。ETL的调度流程非常复杂,不仅需要考虑各个处理步骤的先后顺序、依赖关系等,还需要不同作业间的先后顺序、依赖关系。
[0006]在应用系统(特别是数据分析类系统)中经常需要周期性(按小时、天、周、月、年等周期)批量处理作业,因此对作业执行需要一个较好的时间调度系统。
[0007]针对时间调度的需求,经常使用的是Linux/unix系统的crontab命令,crontab命令可以让使用者在固定时间或固定时间间隔执行程序,crontab命令的时间调度策略比较完善,可以配置为每分钟/小时/天/周/月/年的某个时刻,也可以配置每隔多长时间执行。
[0008]在流行的kettle (开源的ETL工具)中,用户可以可视化设置时间周期或定点执行作业。
[0009]在Java应用中,一般会使用Quarz来解决,Quarz也可以实现定时作业调度。
[0010]以上几种方案不能解决以下问题:
[0011]1、只能控制单个作业的时间调度,不能处理存在依赖关系的作业,包括同机和跨机部署执行的作业,而随着系统复杂性和数据量的增加,不可避免地需要将作业拆分,并按不同周期执行,导致作业间存在先后顺序和依赖关系;
[0012]2、作业是无状态的,只能机械的按照预定周期进行执行,不能适用这类场景:按周期执行的任务只能分析前段周期段的数据,且某个周期执行失败后在后续周期重复执行时能按照顺序从失败周期开始逐段分析不同周期段的数据;
[0013]本发明所要解决的技术问题是提供一种相互依赖的ETL周期性作业的分布式调度方法和系统,以解决在依赖的ETL周期性作业执行过程中的依赖问题,以及作业重做问题。
【发明内容】
[0014]本发明针对现有ETL的调度流程中由于不同作业间的依赖关系导致调度过程复杂的缺陷,提供一种分布式作业调度方法和系统,以解决在依赖的ETL周期性作业执行过程中的依赖问题,以及作业重做问题。
[0015]本发明解决其技术问题采用的技术方案是:提供一种分布式作业调度方法,包括以下步骤:
[0016]S1、作业以分布式方式提交到不同的作业执行程序中进行加载;
[0017]S2、所述作业执行程序根据作业的依赖关系向消息队列订阅加载的作业的依赖作业完成通知,根据消息队列发送的依赖作业完成通知判断加载的作业的依赖作业是否完成,并在加载的作业达到执行时间点且其依赖作业完成时执行加载的作业;
[0018]S3、所述作业执行程序向所述消息队列发布执行成功的作业的完成状态。
[0019]优选地,步骤S2包括以下子步骤:
[0020]S21、所述作业执行程序的调度线程根据作业的作业状态将加载的作业置于调度队列或者依赖队列;
[0021]S22、所述调度线程检查所述依赖队列中作业的依赖关系,并根据所述依赖关系向所述消息队列订阅依赖作业完成通知;
[0022]S23、当接收到所述消息队列返回的依赖作业完成通知时,所述调度线程检查所述依赖队列中依赖于此完成作业的作业,并判断检查出的作业是否还存在其他未完成的依赖作业,若存在则继续等待其他依赖作业的完成通知,若不存则提交所述作业执行程序的执行线程执行;
[0023]S24、所述调度线程定期检查所述调度队列中是否有作业达到执行时间点,若有则进一步判断达到执行时间点的作业是否存在依赖作业,若存在则检查其依赖作业是否均已完成,所述调度线程将达到执行时间点且无依赖作业或者所有依赖作业均已完成的作业提交所述执行线程执行,将达到执行时间点且存在未完成的依赖作业的作业转入所述依赖队列等待其依赖作业完成。
[0024]优选地,步骤S3包括以下子步骤:
[0025]S31、若作业执行成功,所述执行线程根据作业执行的周期计算作业的下一个执行时间点,然后将作业返回所述调度队列,同时向所述消息队列发布作业完成通知;
[0026]S32、若作业执行失败,所述执行线程根据预设的重做周期计算作业的下一个执行时间点,然后将作业返回所述调度队列。
[0027]优选地,所述作业执行程序加载的作业包括作业执行包以及作业状态。
[0028]优选地,置于所述调度队列的作业的作业状态为等待调度状态,置于所述依赖队列的作业的作业状态为等待依赖作业状态。
[0029]提供一种分布式作业调度系统,包括:
[0030]作业加载单元,用于加载以分布式方式提交的作业;
[0031]作业调度及执行单元,用于根据作业的依赖关系向消息队列订阅加载的作业的依赖作业完成通知,以及根据所述消息队列发送的依赖作业完成通知判断加载的作业的依赖作业是否完成,并在加载的作业达到执行时间点且其依赖作业完成时执行加载的作业;
[0032]状态发布单元,用于向所述消息队列发布执行成功的作业的完成状态。
[0033]优选地,所述作业调度及执行单元包括:
[0034]作业归类模块,用于通过调度线程根据作业的作业状态将加载的作业置于调度队列或者依赖队列;
[0035]订阅模块,用于通过所述调度线程检查所述依赖队列中作业的依赖关系,并根据所述依赖关系向所述消息队列订阅依赖作业完成通知;
[0036]第一判断及执行模块,用于在接收到所述消息队列返回的依赖作业完成通知时,通过所述调度线程检查所述依赖队列中依赖于此完成作业的作业,并判断检查出的作业是否还存在其他未完成的依赖作业,若存在则继续等待其他依赖作业的完成通知,若不存则提交执行线程执行;
[0037]第二判断及执行模块,用于通过所述调度线程定期检查所述调度队列中是否有作业达到执行时间点,若有则进一步判断达到执行时间点的作业是否存在依赖作业,若存在则检查其依赖作业是否均已完成,通过所述调度线程将达到执行时间点且无依赖作业或者所有依赖作业均已完成的作业提交所述执行线程执行,将达到执行时间点且存在未完成的依赖作业的作业转入所述依赖队列等待其依赖作业完成。
[0038]优选地,状态发布单元包括:
[0039]发布模块,用于在作业执行成功时,通过所述执行线程根据作业执行的周期计算作业的下一个执行时间点,然后将作业返回所述调度队列,同时向所述消息队列发布作业完成通知;
[0040]计算模块,用于在作业执行失败时,通过所述执行线程根据预设的重做周期计算作业的下一个执行时间点,然后将作业返回所述调度队列。
[0041]优选地,加载的作业包括作业执行包以及作业状态。
[0042]优选地,置于所述调度队列的作业的作业状态为等待调度状态,置于所述依赖队列的作业的作业状态为等待依赖作业状态。
[0043]本发明的分布式作业调度方法和系统具有以下有益效果:保证了周期性ETL作业的及时高效执行,并通过消息队列机制同步依赖作业状态,保证按照作业间的依赖顺序执行作业。
【附图说明】
[0044]图1为本发明的分布式作业调度方法第一实施例的流程图;
[0045]图2为应用了本发明的分布式作业调度方法第一实施例的系统的结构示意图;
[0046]图3为本发明的分布式作业调度方法第一实施例中作业状态的迁移图;
[0047]图4为本发明的分布式作业调度系统第一实施例的功能框图;
[0048]图5为本发明的分布式作业调度系统第一实施例的工作流程图。
【具体实施方式】
[0049]本申请实施例通过提供一种分布式作业调度方法和系统,解决了现有ETL的调度流程中由于不同作业间的依赖关系导致调度过程复杂的缺陷,减少了 ETL调度流程中作业