1. 概述
计算平台的一个核心功能,是任务调度,包含任务之间的依赖处理、任务之间传参、任务的执行等。
本文重点分析和介绍任务调度的需求总结、数据库设计与架构设计。
2. 需求总结
2.1. 术语介绍
术语
- Pipeline,即管线,这里指实际的药物研发管线,例如plk1、zinc
- Job,或Workflow,即任务流,是一系列Task的有向无环图,包含所属Pipeline、创建人、描述、定时配置、hook、最大运行实例数等
- Task,即任务,是执行某一个特定任务的参数集合,包含任务类型、任务配置、任务输入、任务输出等
- Job Instance,指任务流实例。每运行一次Job,则产生一个Job Instance
- Task Instance,指任务实例。每运行一次Task,则产生一个Task Instance
实体之间关系
- Pipeline -> Job, 1 -> n
- Job -> Task, 1 -> n
- Job -> Job Instance, 1 -> n
- Task -> Task Instance, 1 -> n
- Job Instance -> Task Instance, 1 -> n
实体的操作
- 对于Pipeline,支持修改、增加、删除(没有其相关联的Job时)、废弃、完结
- 对于Job,支持修改、增加、删除(将删除其相关联的所有Job Instance)、锁定(锁定后不能修改其配置)、解锁、克隆
- 对于Job Instance,支持暂停、启动、终止、重试
- 对于Task Instance,支持强制终止
2.2. 需求与功能描述
2.2.1. Job的运行方法支持多种
- a.【完整Job】自动运行,由定时器触发,例如每天晚上11点开始
- b.【完整Job】手动运行,由用户手动触发,例如web ui或api触发
- c.【部分Job】手动运行单个Task,不包含该Task的下游Task
- d.【部分Job】手动运行单个Task,包含该Task的下游Task
方法c和d,需要考虑
起始Task
的任务输入
可以默认其前置Task
最近一次Task Instance
的任务输出
也可以将其前置Task
所有Task Instance
的任务输出
按照时间罗列出来,由用户选择其中一个或多个
如果前置Task
不存在Task Instance
,则提示warning,由用户确定是否坚持运行
另外,方法d的起始Task
可能不止一个,要选择一个最小的Subgraph
2.2.2. 修改Task的配置
支持修改、删除或增加Task,修改Task包含Task依赖、Task配置参数等。
Job的Task配置
- Job包含的Task配置,随时可以修改、增加或删除,没有限制
Job Instance的Task配置
- 创建Job Instance时,会复制一份Job当前的Task配置,作为其执行计划
- 所以,支持修改某个
未运行
的Task参数、输入、输出,暂不支持修改任务依赖,也不支持新增或删除
2.2.3. 日志查看
- 调度日志,按照Job Instance分为单独文件,用于查看和分析执行情况
- 任务执行日志,根据不同的任务类型,由任务自身存储
2.2.4. 任务类型
- docker container
- docker swarm service
- slurm task