一、前言
什么是数据血缘?数据血缘是数据产生、加工、转化,数据之间产生的关系。随着公司业务发展,通过数据血缘,能知道数据的流向,以便我们更好地进行数据治理。
政采云大数据平台的作业目前主要有 Spark SQL、PySpark、Spark JAR、数据交换、脚本类型等,最初由于实现难度的问题,考虑解析 SparkPlan( Spark 物理计划)以获取表、字段血缘,但此方案针对 PySpark、Spark JAR 之类的作业自行解析较为复杂,而 Spline 则支持以上类型作业的解析。
下图为 SparkPlan( Spark 物理计划)中的详情。
从 Reference 中可以获取到解析完后依赖的字段信息
通过 Spline REST 文档可见,REST 接口分 Producer 和 Consumer 两部分,Spline Producer 支持把解析完的数据发送到 Kafka,应用可消费 Kafka 数据获取字段血缘数据进行解析,但政采云大数据平台,基于业务需要,字段血缘需要跟作业绑定,若通过消费 Kafka 的方式,无法在获取字段血缘数据的同时跟作业绑定。故,目前使用了调用 Consumer 端接口的方式获取字段血缘。 附,Spline REST 文档
Htools:政采云大数据平台的一个调度工具 IData:政采云大数据平台应用层
解析字段血缘,主要涉及到 Consumer 端的接口,在 Api 接口文档中,我们可以看到各个接口详细的介绍。
以下案例基于 insert into …… select …… 语句的解析
从下图,可以看到一个 insert into …… select …… 语句,被解析成几个步骤,下列截图所对应的步骤,和 Spark 物理计划一致。
Hive 表的 Relation 分 HiveTableRelation 和 LogicalRelation 两种,有 Catalog 的 Hive 表是 LogicalRelation,无 Catalog 的 Hive 表是 HiveTableRelation。
为什么要多此一举再调用接口获取表跟字段的对应信息?
在 Project 中获取输入表和输出表之间的对应的字段,无法知道输入表涉及到的字段对应具体的表,所以需要根据 Relation 获取所有字段和表之间的关系,从而根据字段 Id 获取表。
从 Project 中获得的字段血缘,一些复杂场景是无法直接获取到的。如在实际中,大量涉及到诸如 with input_tab as( …… ) insert into output_tab as select * from input_tab 的语句,这种语句,根据 REST 接口获取到的字段信息,只能获取到最外层的字段信息,跟内层 sql 依赖的字段信息是脱节的,故,需要当前接口辅助获取内层依赖字段。
表、字段血缘跟作业绑定,故,若作业无变化的情况,表、字段的血缘是不会变化的,在作业调度完后,调用解析血缘的接口时,我们结合当前作业版本和前一次血缘记录中的作业版本进行比对,若作业版本不一致的情况才更新血缘,否则则不操作。
如下图所示,可以看到字段 settle_record_id 上下游字段血缘关系。
基于 Spline REST 接口获取表、字段血缘等相关信息,在实际实现过程中,每个作业调用的总接口次数是比较多的,但即便调用次数较多,也在服务器可承受范围内,上线后第一次解析血缘接口调用比较密集,后续只有在作业版本有变化的时候才会重新解析血缘。