Dataphin v3.12 版本对任务节点的上游依赖做了升级改造,v3.11 及之前版本的上游依赖逻辑参见 Dataphin小时调度依赖关系及运行说明。本文将详细说明 v3.12 版本的上游依赖规则。
Dataphin 调度系统基础知识
在进入具体的依赖规则说明之前,需要先解释说明一下 Dataphin 调度系统的一些基础背景知识。
任务与实例
在 Dataphin 的使用过程中,经常会遇到“任务”或“实例”等概念,比如在“运维”界面,可以看到“任务运维”和“实例运维”。部分用户可能已经明白这两者的含义,这里还是再说明下。
- 任务与具体的运行日期时间无关,是一个“定义”,定义运行的具体逻辑与步骤,类似于面向对象编程(OOP)里面的“对象”(object)。提交发布一个集成/计算任务或逻辑表,即创建了一个“任务”。
- 而实例则与运行日期时间有关,任务的某一次运行被称为这个任务的一个“实例”,类似于面向对象编程(OOP)里面的“实例”(instance)。
实例生成周期与任务运行周期
- 周期实例的生成频次为每天一次,系统在每天的 23:00 基于此时的周期任务自动生成第二天的周期实例。同一天内生成的周期实例,就称之为“同周期”的周期实例,这里的“同周期”是指的同“实例生成周期”。“同周期”有时候也叫做“本周期”。
- 任务的“调度属性”中,有一个配置项为“调度周期”,这里的“周期”是指的任务(实例)的“运行周期”,与上面的实例生成周期是完全两个不同的周期。“调度周期”提供了“月/周/日/小时/分钟”五个选项,但在具体实现上都是“天”。
- “日” 任务每天都会生成一个实例
- “月/周” 任务每天也会生成一个实例,但只有指定日期的实例是“正常调度”,其他日期为“空跑调度”。比如: 某个任务调度周期设置为每月 1 日,实际上是每月 1 日的实例正常调度运行,1 日之外的日期全部空跑运行。月/周 任务的实现形式等同于开启了条件调度的日任务(条件为某些日期正常运行,其他日期空跑运行)
- “小时/分钟” 任务每天都会生成多个实例
- 由以上可以得出: 每一个周期任务,无论“调度周期”如何设置,在每一天至少有一个周期实例
- 调度周期也有“同周期”的概念
- 月 调度任务,如果两个月调度任务所制定的正常调度的日期相同(无论起调时间是否相同),则这两个任务视作同运行周期
- 周 调度任务,如果两个周调度任务所制定的正常调度的日期相同(无论起调时间是否相同),则这两个任务视作同运行周期
- 日 调度任务,无论起调时间是否相同,所有日调度任务都视作同运行周期
- 小时/分钟 任务,如果两个任务在一个实例生成周期内的实例个数以及实例起调时间完全一致(调度 cron 表达式一样),则这两个任务视作同运行周期。
- 不同调度周期的任务是不同运行周期,如 周与日是不同运行周期
跨周期依赖
Dataphin 存在两种跨周期依赖,这两个周期在本质上都在同一个时间维度。
- 跨 实例生成周期 依赖。月/周/日任务的自依赖都是跨实例生成周期的依赖,一般为依赖上一个实例生成周期(T-1),也存在跨周期依赖其他任务的情况。除任务自依赖外,两个任务之间的默认依赖规则是同实例生成周期内的依赖。
- 跨 任务运行周期 依赖。如 日调度任务依赖月调度任务,日调度任务依赖小时调度任务,小时任务依赖 cron 表达式不同的其他小时任务
依赖关系
周期任务 A 依赖周期任务 B,最终需要转换为周期实例中的任务 A 的实例依赖任务 B 的实例。周期任务没有时间维度,而周期实例则存在“实例生成周期”和“运行周期”两个时间维度,周期实例基于周期任务来生成,因此需要在任务 A 中需要定义 A 的实例与任务 B 的实例间的依赖关系:
- A 的实例依赖 B 的实例的哪个实例生成周期。
- 例: A ,B 各自对应一张按日分区(分区字段为 ds)且按日更新的表,A 与 B 均是日调度任务,产出 A (ds=20230830) 需要读取 B(ds=20230828),则表示 A 的实例需要依赖前 2 日的 B 的实例
- A 的实例依赖 B 的实例的哪个运行周期。
- 例: A 为日调度任务,B 为小时调度(每个整点运行)。需要指定 A 依赖 B 的具体哪个实例。
Dataphin v3.12 之前的版本,用户只能指定依赖关系里的实例生成周期,运行周期系统有一套内置的规则,用户不可干预修改,v3.12 后对此进行了改进。具体的差异见下表:
v3.9 及之前版本 |
v3.10, v3.11 |
v3.12 |
|
在 A 中指定 B 的实例生成周期 |
支持 仅支持指定 本周期 或 上周期(T-1),本周期与上周期为两个独立的依赖列表 |
支持 仅支持指定 本周期 或 上周期(T-1),本周期与上周期在同一个依赖列表 |
支持 支持指定 本周期 或 上周期(T-1),前 N 天(N<=15),最近 24 小时(特殊周期,见下文说明),所有周期在同一个依赖列表 |
在 A 中指定 B 的运行周期 |
不支持,由系统默认设置 |
不支持,由系统默认设置 |
支持,系统有默认规则,用户可自定义 |
依赖周期和依赖策略
v3.12 将依赖关系中与“周期”相关的部分拆分为了两个部分:
- 依赖周期,用于选择所依赖上游任务的“实例生成周期”。提供四个选项:
- 本周期(当日),即当前任务的实例与上游任务的实例在同一个实例生成周期内。
- 上周期(前 1 日)
- 前 N 日,N 可配置,1 <= N <= 15
- 最近 24 小时,这个选项并不对应实例生成周期,而是基于当前任务起调时间的一个时间区间。要实现小时/分钟任务的跨实例生成周期自依赖,需要引入这个特殊的依赖周期。
- 依赖策略,用于选择所依赖上游任务的具体实例(“运行周期”不同,生成的实例个数不同)。小时任务 A 的运行周期为每小时运行一次,那么在每一个依赖周期(实例生成周期)内,都有 24 个实例。如果将 A 由每小时运行一次修改为每两小时运行一次,一天内的实例个数就会从 24 个减少到 12 个。为了兼容上游任务随时可能的变更,依赖策略提供四个相对化的选项:
- 第一个实例,所选依赖周期内的第一个实例。
- 最后一个实例
- 全部实例
- 最近一个实例,起调时间离当前任务(实例)起调时间最近的实例,优先往后找(悲观策略)
添加新的上游依赖任务时,系统会根据当前任务和上游任务的“调度周期”提供默认的“依赖周期”和“依赖策略”,与 v3.11 的系统内置规则完全兼容,可以参见Dataphin小时调度依赖关系及运行说明 或下表:
本节点调度周期 |
上游节点 |
上游节点调度周期 |
上游节点是否自依赖 |
默认依赖周期 |
默认依赖策略 |
月 |
本节点(自依赖) |
- |
上周期(前 1 日) |
最后一个实例 |
|
周 |
本节点(自依赖) |
- |
上周期(前 1 日) |
最后一个实例 |
|
日 |
本节点(自依赖) |
- |
上周期(前 1 日) |
最后一个实例 |
|
小时 |
本节点(自依赖) |
- |
最近 24 小时 |
最后一个实例 |
|
分钟 |
本节点(自依赖) |
- |
最近 24 小时 |
最后一个实例 |
|
日/周/月 |
非本节点 |
日 |
本周期(当日) |
最后一个实例 |
|
日/周/月 |
非本节点 |
小时/分钟 |
否 |
本周期(当日) |
全部实例 |
日/周/月 |
非本节点 |
小时/分钟 |
是 |
本周期(当日) |
最近一个实例 |
月/周/日/小时/分钟 |
非本节点 |
月/周 |
是 |
本周期(当日) |
最后一个实例 |
月/周/日/小时/分钟 |
非本节点 |
月 |
否 |
本周期(当日) |
最后一个实例 |
月/周/日/小时/分钟 |
非本节点 |
周 |
否 |
本周期(当日) |
最后一个实例 |
小时/分钟 |
非本节点 |
日 |
本周期(当日) |
最后一个实例 |
|
小时/分钟 |
非本节点 |
小时/分钟 |
本周期(当日) |
最近一个实例 |
以上就是 v3.12 版本调度配置的主要升级点。