开发者学堂课程【一站式大数据开发治理平台 DataWorks 初级课程:DataWorks 数据质量介绍及实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/763/detail/13360
DataWorks 数据质量介绍及实践
内容介绍:
一、DataWorks 数据质量简介
二、数据质量使用说明
三、数据质量最佳实践
内容主要分为三部分:第一是在 DataWorks 数据质量模块的简单介绍;第二是数据质量模块的使用说明;第三是使用数据质量模块过程中的最佳实践。
一、DataWorks 数据质量简介
为什么要关注数据质量?简单罗列一些阿里巴巴淘宝网早期所遇到的数据质量问题。
1970年入网的淘宝用户:马总6岁操作 ARPANET 网?
彩票订单为负值:淘宝从用户手中买彩票?
一条物流单不同字段分别记录了北京和上海:中国直辖市合并?
一个人旺旺登录日时长超过24小时:地球停转之日?
交易基础表的金额字段从“元”改成“分”,数值扩大一百倍,导致下游阿里金融的信贷授信模型给商家的授信金额同步扩大,风险资金敞口几个亿,风险贷款上百万;
马总曾经收到6个不同的 GMV 口径
观察到共同点:都是因为数据质量很小的问题导致非常大的业务误差。在数据工程师看来很简单的问题,比如一张交易的基础表金额从元改到分,仅仅是数据表上非常简单的数据格式变更,但带来的后果是非常大的,导致整个下游的信贷模型口径变大,带来业务上的风险。
所以,我们会把数据质量作为数据开发和治理全生命过程中非常重要的一环,在DataWorks 整个产品的版图里,数据质量也是如此。
数据质量问题产生的原因有很多种,既有系统层面的问题,比如来自业务系统的脏数据;也来自业务系统和收藏平台对接过程中系统层面的不一致导致数据传输和转换过程中引入的误差;更可能是因为业务上的一些变化,比如前后端系统是业务系统和数仓平台对于某些数据字段定义上的不一致,业务的日期格式或者金额的格式;上一页的金额单位是元和分,对某个特定字段前后端的定义有些不一致并不会造成系统层面的错误,从技术层面是很难观察到数据值问题。
由于系统和业务双方所带来的一些数据质量问题后果是非常严重的,对于比较轻量级的数据质量问题影响数据加工列入的时间、最后数据产出的时效性,造成数据计算和存储成本上的浪费。
max compute、hive、holo gres 这些引擎中,计算存储是需要金钱的,如果产出数据质量问题的数据,本身是对成本的浪费,处于低层层级问题,这些有问题的数据流入到上层的应用中造成业务上的问题影响上层的决策,更加严重。
因此数据质量本身也是投资业务版图中非常重要的一环,是在数据治理版块处于核心。数据质量同时也需要依赖底层的统一的元数据服务和任务调度服务支撑功能。这一重点也会在后续的功能介绍中明显看到。
投资数据质量模块主要的特色有三方面:
第一方面:首先,它是数据开发和调度模块深度集成,这是和市面上其他的数据质量产品的不同,集成主要分为:首先它是全面支持 DataWorks 底层的离线数据计算存储引擎,比如 max computer、 EMR hive、 Hologres、 ADB-PG。
这些都被接入到数据质量的离线监控模块上;其次 DataWorks 数据质量规则是由调度系统来触发的,核心是能够在最佳的时间点来调度数据质量监控规则去扫描表,这样节省计算资源的同时也能及时发现数据质量问题;如果是强规则,还会及时去阻塞下游任务防止问题数据污染到下一个表上;
第二方面:37种内置模板能够快速的配置数据质量监控,不能覆盖的场景还可以用自定义的方式来适配更多的业务。
用内置的模板规则会有一种动态阈值的模式,不需要去设置具体的监控指标的阈值,这就解决日常的小纠结--在配置规则时,不知道阈值要设置成什么?这种问题就交给后台算法,让它来自动判断指标的异常点;使用自定义规则也有很方便的功能,把它沉淀成为模板,让别人或自己在其他表上再去使用,方便组织内部的数据质量规则标准化;
除了离线的数据质量监控之外,也支持实时的数据质量监控。基于阿里云大数据系列产品的实时数据通道 Datahub 以及实时数据加工引擎 Blink 能够去支持实时数据流监控,目前支持断流、延迟和自定义三种实时数据质量监控规则。
数据质量模块的主要功能架构分为离线和实时两部分,离线数据质量监控支持 max computer、 EMR hive、 Hologres、 ADB-PG 四种不同的引擎,支持内置的模板规则和自定义SQL规则,同时自定义规则还可以呈现出自定义规则模板。
所有的规则都支持四种不同的监控方式:绝对值监控、同比/环比监控(这样可以和上周期的业务进行比较)、波动率监控、动态阈值监控。实时这部分支持断流监控、延迟监控和自定义监控。所有的数据质量问题支持通过短信、邮件和钉钉群通知的方式发送。除了这三种不同的触达渠道之外,这些数据质量问题和指标都会汇总到自定义质量报表上通过邮件周期性的送达出来,网页端实时查看,能够非常直观的观察到目前数据质量的整体情况。最后,数据质量模块包括规则分区表达式、订阅人等等对象的增删改查,都是通过 open API 进行的。
数据质量规则绑定在调度的任务上。具体可以在这张图上看到
首先每条规则自然有张对应的表,规则是扫描表的关系。
除这层关系之外,其实每条规则需要绑定到具体的任务节点产出表的任务上,比如这张任务是由某一段 SQL 条本来写录的,可能每天或每小时都会通过任务节点把数据写入到表,会自动触发规则扫描该表,实际是扫描该表数据质量问题最佳时机,因为数据刚写入该表,如有问题第一时间就会被发现,很严重还有进一步措施。
任务节点扫描某一张表,同时产出一个橙色阈值或红色阈值,无论触发哪一种阈值都会引起短信、邮件、钉钉群通知报警;强规则并触发红色阈值同时阻塞到任务节点的下级节点,防止质量问题的扩散,也防止计算资源的浪费。这是数据质量离线监控的特色功能--把规则和任务节点绑定一起决定实时质量监控的时间点。
这是支持的37种不同的模板规则,可以看到有数值型和波动率两部分,数值型规则是对某个特定的指标本身来进行监控,比如表行数、表大小、字段积的最大值最小值;波动率规则和历史取值进行对比,在后台会维护历史指标的存储,方便大家根据特定指标的历史波动值来判断最新指标是否存在异常;自定义 SQL 方式定义数据质量规则与之相同,在离线数据质量监控的同时也支持实时数据质量监控的。
关心实时数据的质量是因为业务对数据的时效性要求越来越高,实时数仓理念深入人心,实时数据一旦出现数据问题,本身的排查、解决相比离线的数据质量困难,首先实时数据吞吐量非常大,一有问题会淹没在海量数据中,排查起来就很困难,根本不知道每秒上百条的数据究竟哪一秒哪一条数据有问题,所以需要有自动化系统监控;
其次实时的数据质量问题是直接会影响到在线的业务,因为离线数据可能会有一定的时间力度修复,实时数据有问题直接会体现到在线的业务上。对实时数据质量问题的敏感度其实是要比离线数据质量问题要高;实时数据质量最终会影响到离线数据质量的,一般来说,实时数据都会归档到离线数层中,实时数据的源头是有问题的,自然也会影响到离线数据质量。
在 DataWorks 的数据质量模块里支持三种不同的方式监控实时数据质量方面,有断流监控、延迟监控、自定义 Blink SQL 机构的方式定义业务层的数据质量的规则。
在后面也会详细讲到,断流和延迟的概念上是很清晰的,断流是指数据通道在一段时间内没有新数据进来,断流的阈值是可以设定的,可以是十秒钟、十分钟,力度都非常高;延迟是指数据流里时间戳的字段时间和系统时钟差值扩大,就认为最新的数据延迟太大,已经丧失实时系统时效性,本身会有数据延迟的问题。
自定义 SQL 规则方面比较灵活,引入一张维度表和实时数据做关联,也可以引入两条实时数据的链路进行双流或更多流的状态,其实是和实际的业务场景有关系的。
二、数据质量使用说明
投资数据质量模块简介(未覆盖全部的功能),下面会对数据质量模块的使用做较详细的说明。
首先离线数据质量校验使用很简单,都是在图形化的界面上,要选以 max computer的实时数据质量监控为例,同时还支持 EMR hive、 Hologres、 ADB-PG 四种离线的计算存储引擎。
以 max computer 的表为例,要选择 ods-user- info-d 这张表,要定很特殊的对象值叫做分区表达式,在离线系统中,数据会分次写到不同的分区中,分区大部分情况下是和业务日期相关联,最新的数据只会写到最新的分区,定义分区表达式的目的是为了限定质量问题扫描的范围,实际每天只要扫描最新的分区就够了。
最新的分区格式在不同的表上名称定义的方式是不同的。需要通过分区表达式定义最新的分区名称,定义的过程是很灵活的,有一套完整的变量体系,比如最基本的$再加上[],中间指定 YYYYMMDD 调度日期--离线规则被触发的那一刻所在的这个年月日。
组成这个字符串定分区名,质量规则会去扫描具体的分区;更常用的是第二条分区表达式的例子,就是 YYYYMMDD-1,因为通常第二天才会去处理第一天的业务,对应的一小时分区是以小时级的任务去写入的,会通过这种方式来定义一小时之前的分区名。这种小时级别的表一般都会有多重分区的体系,为了精确地判断数据质量问题,在多级分区表中,分区表达式只需要精确到最后一集的分区。不同级的分区名用斜杠来区分。
创建分区表达式后,可以在对应的分区表达式下创建质量规则。用过数据质量的同学应该对界面很熟悉,点击模板规则下的添加监控规则,可以很方便的添加内置模板规则。
这里有一些很详细的配置项,比如规则的强和弱,强规则是会阻塞下游的电路,弱规则仅仅把报警发送出来,还有动态阈值的配置。
在规则字段选项里选择是表级规则还是字段级规则。字段级规则可以精确选择是针对哪个字段的规则,这里系统会自动判断是字符串型的字段还是数值型的字段,给出可用模板,就在规则模板的选项中。
比较方式有个非常复杂的设定,固定值比较、波动率绝对值比较、波动率上升或下降比较。不同的规则和校验方式有不同的配置。
另一方面模板规则不符合要求,可以设置自定义规则,自定义规则使用起来很简单,在刚才创建规则的窗口里,选择自定义规则就可以在窗口里写入 SQL,SQL 本身会有一定的要求,符合要求的 SQL 都可以被纳入到自定义规则监控中。
着重强调两个功能:一是动态阈值,如果在配置规则的界面上动态阈值的选项选“是”,意味着要配置动态阈值方式规则,会发现下面的配置变得简单很多,不需要复杂的阈值设定,取而代之的是算法参考样本量的配置,只需要指定让系统去关注多少天之内的样本量,基于样本量通过一些平滑的算法判断最新的指标点是否在预期的区间范围内,在区间范围内认为是正常的指标项,在突破预测的上、下界认为质量问题存在,基于历史数据系统会自动判定一个上界和下界,最新数据落在上下界内,系统认为是被接受的,如果突破上下界,系统存在数据质量问题。
另一个着重强调,自定义模板是自定义规则的进阶用法,是通过一段 SQL 来进行复杂业务场景的校验,需要用自定义规则去校验的表比较多,配置起来工作量较大,也容易出现 SQL 代码管理起来很复杂的问题,或由于业务的变化 SQL 脚本本身需要修改,这就用到自定义规则模板库的功能,本质上把自定义规则固化成模板,在使用规则时就可以像使用内置模板规则一样。
在数据质量的界面上看到规则模板库,进入后会有模板库的目录数,可以像配置自定义 SQL 规则那样去配置模板,不相同的用${Table name}来指代表明,同理[]仍然用来指代分区表达式,和自定义 SQL 规则的用法是相同的,创建完自定义规则后,再使用模板规则时可以在规则来源中选择规则模板库,选择到对应的目录,再选择刚才所配置的模板就可看到配置的模板就显示在这里,这样方便规则代码统一管理。
内置模板规则、自定义模板规则或自定义 SQL 规则配置完成后,把扫描的结果通知出,需要配置订阅人,在 DataWorks 的界面上有订阅管理的按钮,点击按钮后去配置不同的订阅方式,可以看到短信、邮件或钉钉群的方式。
其次还有试跑功能,点击后就立刻运行刚才配置的规则,用来校验规则配置的正确性,同时也是一种规则校验的手段,可以通过手动试跑的方式来运行规则;
最后在数据质量的界面把规则绑定调度的任务上,在运维中心的界面也可绑定。把质量规则和调度节点绑定一起能够让两侧联动起来,从而联通数据开发和治理的流程,手动运行的、调度来触发的规则,任务调研的结果都可以在任务查询菜单里看到。
实时数据质量校验操作和离线数据质量规则操作非常相似。在配置规则的界面上选择datahub topic,系统会自动判断并配置实时数据值,关联 blink 项目就能把实时数据质量校验的任务运行在对应的 Project。配置一些规则,比如断流规则、延迟规则、自定义规则,按照图示的方式配置。
配置完成离线规则和实时规则后,希望周期性的收到质量报告,数据质量也提供数据质量报告的定义,只要在菜单中进入报告模板管理创建报告模板,定义报告里面要显示的内容,比如规则的配置情况、数据表和 datahub topic 的数量以及所配置规则的数量,从而计算出监控的覆盖度,还有规则运行情况、报警情况、断流情况、阻塞情况都可以在数据质量报表中体现出来。
三、数据质量最佳实践
针对数仓系统,质量规则的类型有很多,支持37种模板同时也支持自定义规则,什么表配置什么规则其实有不成文指南。
比如数据员刚刚把数据抽取到数仓入口层,通常会去检测主外键是否缺失、周期性数据量的波动是否过大,今天的分区数据量明显的比上周期的要小,或数据量突然变大,需要关注数据有重复导入的可能性。
在数据的清洗层和加工层判断数据的唯一性和重复性,比如做 join 或做分组时会导致重复数据。
在高度汇总的数仓层做平衡值监控。平衡值可能基于一些统计,比如求和、平均、或最大最小值,通过统计指标来判断高度汇总层在汇总数据过程中是否产生业务语义上的变形。
比如明细表的某些数值列的汇总值和汇总表的数对应列的汇总值是相同的。这种需要监控平衡值来确保加工过程中的逻辑不会造成业务语义上的行列。
同时,在维度表和实时表关注主外键的一致性,维度值的数量就是指离散值的数量,离线规则里也有对应的模板可用。
出口层(应用层、报表层)需要通过特殊的业务逻辑。这里就会用自定义SQL规则来定义特殊业务,发现有些规则用的多,经过统计表级的规则中表行数和表大小两种规则使用比较多,主要用来监控某些分区是否为空,会不会有突变数据猛增的情况,字段型规则所罗列的比较多,不同的数仓分层中所用的常用规则是一致的,比如字段为1值的个数,可以在维度表用到,监控维度数量是否有异常的变化、空值和重复值的个数,做主外键是否缺失监控。
这种规则用的比较多,关于规则的强弱需要合理选择。认为脏数据是比较关键的,不希望它到下游的表中,设置成强规则,其他的尽可能设置成弱。
关系到系统资源的成本,毕竟强规则用 max compute 的资源较多,并且会阻塞最终任务的产出,影响最终数据的时效性。
波动率的检测趋势有上升、下降和绝对值,可以根据业务的需要设置。橙色阈值是不会阻塞下游的任务。红色阈值会触发阻塞下游链路的动作,无论是橙色阈值还是红色阈值都要精确到百分比的小数点的后两位。
这里罗列一些经常会遇到的问题:
问:数据质量模块是否收费?
答:对公共云用户,按照质量规则实例运行数量计费,其中部分功能仅在 DataWorks 企业版中开启。
详见https://help.aliyun.com/document detail/118793.html。
问:自定义规则使用怎样的 SQL 语法?
答:离线自定义规则使用 MaxComputeSQL,实时自定义规则使用 BlinkSQL。目前只接受查询语句,并限制为单行单列输出。
问:收到了数据质量报警,怎样才能快速定位触发的业务流程节点?
答:在数据质量-任务查询界面,找到报警对应的节点 ID,至运维中心中查询即可。
问:数据质量与智能监控一起使用,需要特别注意什么?
答:对离线数据来说,强弱规则运行的时机不同:
·弱规则优先级较低,且与下游任务并发执行,基本不影响基线产出
·强规则优先级高,会在下游任务运行前执行,计入基线运行时间
·强规则还可能阻塞下游任务,如果下游有基线,请为后面的同学负责