数据地图中的血缘都来源于对数据开发任务的代码解析。
全量定时任务会触发解析动作。
全量定时任务执行规则:
小时级运行,拉取全量的任务,计算血缘,与数据地图中已有的血缘做对比,并将不一致处写入数据地图。
数据地图中,血缘的数据结构是 表->任务->表。其中,表和任务是两种实体,二者之间存在生产关系。
假设有以下开发任务链路,且1号加工任务是小时级调度执行。
如果1号加工任务中使用了“drop table + create table”的组合,则每次1号加工任务运行时,中间表都会重建一次,进而导致任务执行过程中血缘关系消失。具体情况如下:
当1号加工任务执行到 drop table 语句时,会清理掉中间表以及其与1号、2号加工任务的关联关系,从而清空血缘关系。
当1号加工任务执行 create table 语句时,又会重建中间表。但是,由于1号加工任务和2号加工任务都没有发生变化,数据地图不感知,无法重建中间表与两个任务的关联关系,因此血缘关系依然缺失。
当全量血缘解析任务运行时,会拉取1号加工任务,解析血缘,并与数据地图中现有血缘数据对比,将1号加工任务与表的关系重新创建出来,此时血缘关系才会重新出现中间表。
方案一
使用“create table if not exist + truncate + insert into”的组合,确保表建出来后,做数据清理,这样可以保持血缘以及其他各种关系不变。
方案二
使用“create table if not exist + insert overwrite”的组合,确保表建出来后,使用 overwrite 来做复写。
方案三
使用“分区表 + TTL(Time to Live,生存时间)”的方式,即每天往新的分区里写入,并通过 TTL 将分区数量保持在一定范围内。