区别一:适用的实例对象范围不同
通常情况下,当实例运行完成后,会变为成功或失败状态。此时如果用户可能因为各种原因需要对实例进行重跑,就可以通过重跑按钮进行实例的重跑。重跑时,系统会按照最新发布的代码版本执行。Dataphin支持针对单个实例进行重跑、或选中一个起点及其下游,按照依赖关系进行批量重跑(如整条链路计算逻辑修改等场景),以实现全链路数据更新。
可能存在某些处于非成功或失败状态的实例,不满足重跑操作所要求条件(实例依赖的所有上游实例运行成功并到达当前实例的定时调度时间)的情况,此时就需要采用强制重跑操作。
如下图所示,重跑主要针对正常运行结束后状态为成功或失败的实例,而强制重跑可以无视实例的状态强制运行。
实例生命周期状态
区别二:运行机制不同
场景一:任务A少读取了一部分数据,任务B因为缺少这部分数据运行失败了,对任务A的代码逻辑进行修复后,需要从A开始向下重跑。
如下图所示,A、B、C 三个任务,存在着依次依赖的关系,需要上一个任务成功运行完成后,才能开始运行下一个任务。此时 B 任务运行失败了,C 任务处于未运行状态。
重跑:当我们选择重跑节点时,仅可选择 A 和 B 任务, C 任务因为不满足重跑运行条件(上游所有任务成功完成),不能选择。我们可选择重跑 B 节点,当 B 点成功完成后,C 任务会因为满足运行条件(上游所有任务成功完成且到达调度时间)自动开始运行,而无需进行额外的设置。
强制重跑:我们也可以无视任务状态,对 B、C 选择强制重跑,此时系统会根据节点依赖关系,依次运行 B 和 C 节点。
通常情况下,我们重跑失败的节点即可,无需对下游节点进行额外操作。
场景二:任务 B 的代码存在问题导致写入分区的数据为空,因此当任务 C 读取表的时候运行失败了。此时用户对 B 节点的代码进行了改写,并重跑。在 B 节点运行过程中,发现了 A 节点的代码也存在问题,对 A 节点任务进行的修改。此时,用户选择重跑或强制重跑,运行结果会有极大不同。
重跑:此时由于 B 节点处于运行中,因此无法进行重跑。我们仅能对 A 和 C 节点进行重跑操作,且因为处于依赖链条中间的 B 节点并不参加此次的重跑,系统会将 A 和 C 节点当成两个独立的节点运行。因此,A 节点更新的数据并不会对 B 和 C 的任务生效。
强制重跑:可以无视任务状态,对 A、B、C 节点选择强制重跑,此时系统会强制终止掉运行中的 B 任务,将所有任务置为未运行状态,然后再根据节点的相互依赖关系依次运行。此时,A 节点更新的数据会对下游所有任务生效。
适用场景
通常情况下,当任务运行失败时,我们只要选择失败的任务进行重跑就可以了。下游处于未运行状态的节点会在上游节点运行成功后自动开始运行。
在某些特殊场景下,我们可以忽略上游实例的运行状态(一般是无数据依赖,仅调度依赖,或者对数据实效性要求不高的情况),使用强制重跑功能来恢复运行。另外,如果运行到链路中间的任务,忽然发现上游任务有数据错误的情况需要及时止损,可以采用强制重跑功能。此时,系统会先将所有选中的任务批量终止,再从最上游实例按照依赖关系依次向下运行,避免新老代码并存产生的数据错乱。