在离线开发中每天都有大量的任务会根据调度和依赖自动生成实例。当某个具有大量下游的实例因某些原因(如源头数据丢失、计算逻辑错误、依赖缺失导致提前执行等等)导致输出的数据产生异常,并且因为没有配置数据质量监控或未命中监控规则,导致有问题的实例正常生成。此时,问题数据就会向下游扩散,污染更多下游产出数据。冻结池可以防止问题数据的扩散。

批量冻结及修复功能,可通过三个步骤快速阻断并高效完成数据恢复:

  • 步骤一:创建冻结池。
    通过新建一个冻结池任务,并添加源头的问题任务并生成冻结池。系统会自动将源头任务的所有下游依赖任务都纳入到该冻结池中。被纳入到冻结池中的任务会被冻结,运行中的实例会被终止,未生成的实例会停止生成。至此,完成数据污染扩散的阻断。

  • 步骤二:源头任务处理。
    处理人员分析出现问题的原因,制定解决方案,并解决问题。

  • 步骤三:冻结池恢复。
    对冻结池执行解冻操作,系统会自动从源头任务开始逐个解冻任务。单个任务的解冻过程为:任务会从冻结状态变为解冻中,之后对应的实例执行重跑,重跑成功后,任务状态变为已解冻。如果期间出现重跑失败等,则需要人工介入处理。如果将任务强制置为成功,任务会继续往下解冻,直至所有任务都被解冻。

此外,冻结池还支持暂停、更新、恢复解冻、废弃等功能,应对问题修复过程中出现的多种突发情况。

冻结池的入口位于周期实例运维页面顶部,目前仅支持项目负责人和管理员进行操作。

功能介绍


冻结池功能的列表页,会展示所有历史的冻结池及冻结池的状态、创建人、创建时间、最近操作人、最近操作时间等。

下图为冻结池列表页:
冻结池 - 图1

创建冻结池


冻结池创建步骤如下:

  1. 冻结池创建时,首先要确定参照日期和冻结池名称。参照日期表示需要选择将冻结哪一天的任务,当前支持昨天、今天和明天,默认是今天。冻结池名称目前会自动生成。

    注意: 目前有一个约束条件,同一个参照日期下,仅允许有一个在生效的冻结池,即除状态为已解冻、已废弃、失败之外的解冻池最多只有一个。
    下图为创建冻结池的页面:
    20 任务运维14.png

  2. 接下来,需要在选择源头任务中确定需要冻结的源头任务,可通过勾选或者批量导入的方式,添加到右侧已选任务,之后可进行冻结预览。
    20 任务运维14.png

  3. 通过冻结预览,查看到源头任务和系统计算出的所有下游任务,确定这些任务是否可冻结。
    20 任务运维15.png

  4. 执行创建并执行操作,系统将开始从源头任务,按照任务血源依赖向下游冻结任务,并终止这些任务的实例。

解冻冻结池


冻结池冻结后,需要项目负责人或管理员将有问题的任务实例进行处理,修复异常数据,之后就可以进行解冻操作。具体可在列表操作列,点击解冻,开始冻结池解冻操作。将会重跑所有已生成实例ID的实例,如果这中间实例重跑失败,则需要人工介入及时处理。

下图为冻结池详情页的冻结任务页面,会展示任务解冻率、任务总数、已解冻(任务数)、重跑成功率、需重跑实例总数和重跑成功数等指标。
2021-07-18-22-58-03.png

下图为冻结池中任务相关实例的列表,其中会通过实例重跑标记来表示实例的重跑情况,包括:待重跑、重跑中、重跑成功、重跑异常、实例的重跑实例。
20 任务运维16.png

参数信息 说明
待重跑 指冻结池任务需要重跑的已生成的线上调度实例。
重跑中 指当前线上调度实例已经被冻结池解冻操作生成重跑实例,该重跑实例的生成时间必须在执行冻结池解冻或恢复解冻操作之后。
重跑成功 指重跑中的实例之后的结果为成功。
重跑异常 指重跑中的实例之后的结果为失败或者终止。
实例的重跑实例 指冻结池任务的实例被冻结池解冻操作生成的重跑实例(不含手动重跑)。

当任务解冻率100%时,则说明问题已被修复。但是往往会出现部分实例可能重跑不通过等,此时需要处理人员去单独逐个解决。解决后,可在相关实例中,强制解冻任务。
20 任务运维17.png

其它操作


目前,冻结池还支持暂停、更新、恢复解冻、废弃等功能,应对问题修复过程中出现的多种突发情况。比如,如果发现在解冻中,发现遗漏了一个有问题的源头任务,则可以先暂停冻结池,然后再在里面增加源头任务,并重新启动。这样就可以按新的源头任务生成新冻结池。之后,再次恢复解冻时,系统会确保新加入任务的所有下游会再次重跑。

当冻结池解冻完成或解冻失败时,支持给指定用户发送告警信息,帮助用户及时获得冻结池最新状态信息。冻结池在解冻下游时存在判断,如果有冻结池外的上游任务未运行完成,则冻结池解冻会被暂停,并在重跑标记旁显示图标提醒用户,需要等到上游任务运行完成后,冻结池才会继续解冻实例。例如当把源头任务A加入冻结池后,下游B、C、D任务会被冻结,冻结池解冻后,系统会从A开始重跑,但由于下游D还有一个冻结池外的上游F为失败状态,此时D会解冻失败,需要等待F运行成功后,D才会继续解冻。