大数据时代,数据的来源极其广泛,各种类型的数据在快速产生,数据也是爆发性增长。从数据的产生,通过加工融合流转产生新的数据,到最终消亡,数据之间的关联关系可以称之为数据血缘关系。在数据中台的大背景下,数仓的开发者经常需要解决以下问题:其实,以上的这些问题都可以统一归类为数据发现问题。大部分企业会针对离线数仓任务进行SQL分析,构建表和字段的血缘关系,数据发现包括但不限于: 数据 表/列的业务分类分级和机密字段识别等。
数据血缘(Data Lineage),指的是数据从产生、ETL处理、加工、融合、流转到最终消亡,数据之间自然形成一种关系。这些关系就是描述数据的数据(元数据)。掌握了这个元数据,就能最大程度的做好数据的应用和管理。tips:有童鞋对元数据感兴趣的,可以看这篇文章https://zhuanlan.zhihu.com/p/336504407
针对任务的表和字段,通过血缘关系可以确定表的上下游,以及对应这个表所涵盖的业务范围包括哪些
通过收集调度任务的开始结束时间,了解任务ETL链路的时间瓶颈,在根据JOB的执行情况定位性能瓶颈,通过调整任务的基线、保证任务的资源提供,提升整条ETL链路的执行效率。
若在某天的调度中,发现数据异常,想确认是什么造成,可根据DQC和血缘关系了解底层数据波动情况,快速定位原因。
数仓链路优化
通过对表和字段的下游使用频次,找到使用较多的,分析其是否有重复计算、浪费资源的情况。再判断是否可以因此建设事实或维度表、或者把计算的指标或维度沉淀。
在平时的开发过程中,很可能修改过SQL,但是忘记在调度平台上配置相对应的依赖,这样很可能会出现问题,其实通过调度平台的调度关系的元数据,和收集到的血缘关系进行对比,可定时性的判断调度任务依赖是否准确。
本文只阐述最基本的表级别的血缘关系的实现思路,真实的血缘实现,远比文章中的场景复杂。
在最开始时,刚毕业的小白,如果让你做好数仓的血缘元数据时,你会怎么做?
在初期的小白根本就不懂编译器、语法分析、词法分析以及AST这些概念时,想到的唯一办法就是通过正则这个朴素的手段去解析SQL了,想法也非常直接,FROM或者JOIN后面就是源表,INSERT INTO/INSERT OVERWRITE TABLE后面就是目标表。source_table_regex = re.compile(r"(?:from|join)\s+(\S*)(?:\s+|;)", re.IGNORECASE)
target_table_regex = re.compile(r"insert\s+(?:into|overwrite)\s+table\s+(\S*)\s+", re.IGNORECASE)
select * from tableA
where description = "from Excel";
你会发现,这个思路有很多漏洞。事实上如果加上一些if-else的判断,这个方案其实也满足了大部分场景。但是!!!!身为开发人员一定要明白一个理念,当你在生产环境中只要有一个场景没有满足,那就是bug。
首先针对思路二,大家可以提前了解AST的概念,参考https://blog.csdn.net/u013212754/article/details/106981084其次在了解思路二前提下,需要知道Hive SQL的执行过程(毕竟还是看的HQL的语法树)以及一些名词解释。
Hive根据Antlr定义的词法、语法规则完成词法、语法分析将HQL解析为AST Tree;
遍历AST Tree,抽象出查询的基本组成单元Query Block;
遍历Query Block解析为操作树Operator Tree(即,逻辑执行计划);
逻辑优化器进行操作树变换,合并多余的ReduceSinkOperator,减少shuffle;
遍历Operator Tree,将操作树翻译为对应的MapReduce任务;
物理优化器进行MapReduce任务变换,生成最终的执行计划。
- 对Hive SQL进行词法分析和语法分析,获取对应的AST 原始的抽象语法树
- AST语法树剪枝优化,减少遍历次数,提高语义解析的效率,具体主要做两方面的优化:
- 针对token中涉及到的无效解析节点进行删除,如order by,distributedby,cluster by,sort by以及limit;
- 针对token中where/having的子查询,在保证SQL语法正确性以及语义完整性的前提下,采用1=1 等价策略进行等价替换,降低了血缘关系解析的复杂性;
通过以上两种剪枝操作,既可以减少SQL语句的复杂性,又可以降低AST语法树的层级,进一步减少了遍历AST树递归次数,降低血缘分析的复杂性,提高了语句解析效率。
- 遍历AST获取上游表名和下游表名,在SQL语句中存在大部分SQL语句片段即CTE。由于其在血缘关系解析中不起关键作用,且对SQL解析带来很大困扰,因此血缘关系解析需对CTE类型进行识别,并进行替换与删除。
市面上其实针对数据血缘的产品有很多,像阿里DataWorks的数据地图、字节的DataLeap以及非常火的开源产品Apache Atlas都是非常好用工具产品。但是本质上是想通过这篇文章,让小伙伴们在使用这些产品的时候多去思考这些产品背后的实现原理。*文/Weki
关注得物技术,每周一三五晚18:30更新技术干货
要是觉得文章对你有帮助的话,欢迎评论转发点赞~
活动推荐
主题:
得物无线技术沙龙(第三期)
时间:
12月4日 14:00 - 18:00
报名方式:
更多详情,请点击「沙龙详情」