gitbook/数据中台实战课/docs/224906.md

182 lines
16 KiB
Markdown
Raw Permalink Normal View History

2022-09-03 22:05:03 +08:00
# 07 | 同事老打脸说数据有问题,该怎么彻底解决?
你好,我是郭忆。
上一节课,我带你从模型设计层面,逐步将分散、杂乱、烟囱式的小数仓整合成了可复用、可共享的数据中台,数据研发效能提升了一倍。那是不是交付数据足够快,使用数据的人就满意了? 当然不是,来看发生在我身边的一件事儿。
供应链部门运营陈英俊化名每天上班第一件事情就是打开供应链辅助决策系统数据产品根据系统上给出的商品库存数据、区域下单数据制订商品的采购计划然后发送给供货商。可是今天当他准备工作时突然发现系统中部分商品库存数据显示为0他第一时间将问题反馈给了数据部门。与此同时与他一样无法工作的还有供应链部门的其他50多名运营。
![](https://static001.geekbang.org/resource/image/bc/7d/bcd45f4e938efe5e215e505f3e4f0b7d.jpg "图1 ADS层商品库存表加工链路图")
接到投诉后负责库存域的数据开发郝建化名立即开始定位首先就“商品库存”指标的产出表ads\_wms\_sku\_stock\_1d进行排查确认它产出任务没有问题是这个任务的上游输入表数据有问题引发下游表数据异常。
从数据血缘图中你可以看到ads\_wms\_sku\_stock\_1d上游有20多张表郝建逐层校验是哪个表的数据出现问题结果锁定在了dwd\_wms\_inbound\_stock\_df。这张表的产出任务在前一天有一次线上变更任务代码存在漏洞对部分商品入库数据格式解析异常但是没有将异常抛出导致产出数据表dwd\_wms\_inbound\_stock\_df 数据异常,进而影响了所有下游表。
排查问题用了近3个小时。
既然问题定位清楚就要开始修复的流程。修改好代码后郝建重新跑了dwd\_wms\_inbound\_stock\_df的产出任务确认数据没有问题然后需要重跑该任务下游链路上的5个任务图中红色表的产出任务
运行完任务用了5个小时。
经过数据验证确认没有问题此时已经过去了将近9个小时。对于像陈英俊这样的运营来说一天都无法工作。如果你是陈英俊 对数据会满意吗?**所以,光快还不够,还要保证质量。**
当然,这个例子暴露出这样几个问题:
* 数据部门晚于业务方发现数据异常,被投诉后才发现问题。
* 出现问题后,数据部门无法快速定位到数据异常的根源,排查用了较长的时间。
* 故障出现在数据加工链路的上游顶端,出现问题没有第一时间报警处理,导致问题修复时,所有下游链路上的任务都要运行,修复时间成本非常高。
**这些问题最终导致了数据长时间不可用。**那如何解决这些问题,确保数据高质量的交付呢? 首先,你要了解产生这些问题的根源,毕竟认识问题才能解决问题。
## 数据质量问题的根源
在网易电商业务数据中台构建之初我对数据团队一年内记录在案的321次数据质量事件做了逐一分析对这些事件的原因进行了归纳主要有下面几类。这里多说一句如果你想改进数据质量不妨也对过去踩过的坑做一次复盘归一下类看看问题都出在哪里然后制定针对性的改进计划。
![](https://static001.geekbang.org/resource/image/91/68/9191c7dd526022341edaf98c5be2be68.jpg)
#### 业务源系统变更
数据中台的数据来源于业务系统而源系统变更一般会引发3类异常情况
**首先是源系统数据库表结构变更。**例如业务系统新版本发布上线,对数据库进行了表结构变更,增加了一个字段,同时对部分字段的类型、枚举值进行了调整。这种表结构变更没有通知到数据团队,导致数据同步任务或者数据清洗任务异常,进而影响了下游数据产出。
![](https://static001.geekbang.org/resource/image/5d/2c/5d679674ecb108d152251d1777c8722c.jpg "图2 日志服务器扩容误操作引发数据异常")
**第二个是源系统环境变更。**我经常在大促期间见到这种情况其中的典型是前端用户行为埋点日志量暴增系统管理员紧急对服务器进行扩容上线了5台新的服务器但是没有配置这5台服务器的日志同步任务结果导致数据侧少了这5台服务器的数据最终影响了数据计算结果的准确性。
**最后一个是源系统日志数据格式异常。**这种情况通常出现在前后端埋点日志中。业务系统发布上线引入埋点BUG导致IP格式出现了不符合约定的格式比如我们一般约定的IP格式是166.111.4.129结果出现了166.111.4.null最终也会导致计算结果错误。
#### 数据开发任务变更
这种情况在数据质量事件中占到了60%以上,而它大多数是由于数据开发的纰漏引发的,来看几个你比较熟悉的例子:
* 任务发布上线,代码中引用的测试库没有修改为线上库,结果污染了线上数据;
* 任务发布上线,代码中使用了固定分区,没有切换为“${azkaban.flow.1.days.ago}”,导致数据异常;
* 前面例子中,数据格式处理错误,代码忽略了异常,导致数据错误;
* 任务配置异常,它通常表现在任务没有配置依赖,前一个任务没有运行完,后一个任务就开始运行,输入数据不完整,导致下游数据产出错误。
#### 物理资源不足
![](https://static001.geekbang.org/resource/image/c4/89/c45309ce7dcc381aab2c5f4ca770f589.jpg "图3 Hadoop多队列任务提交")
在多租户下Hadoop生态的大数据任务MRHiveSpark一般运行在yarn管理的多个队列上调度器为CapacityScheduluer每个队列都是分配了一定大小的计算资源CPU、内存
![](https://static001.geekbang.org/resource/image/c1/41/c1e5cdb298ff76bc0b68dce656190541.jpg "图4 物理资源不足导致任务延迟")
我展示了两种常见的物理资源不足,导致任务延迟产出的情况。
#### 基础设施不稳定
从数量上来看,这类异常不算多,但影响却是全局性的。我们曾经在大促期间,碰到了一个[Hadoop 2.7 NameNode的BUG](https://issues.apache.org/jira/browse/HDFS-10453)造成HDFS整个服务都停止读写最终通过临时补丁的方式才修复。
总的来说,出现问题并不可怕,可怕的是,我们没有及时发现问题,尽快恢复服务,举一反三地通过流程和技术手段,降低问题出现的概率。所以接下来我们就来看一看,如何提高数据质量?
## 如何提高数据质量?
我认为,要想提升数据质量,最重要的就是“早发现,早恢复”:
* 早发现,是要能够先于数据使用方发现数据的问题,尽可能在出现问题的源头发现问题,这样就为“早恢复”争取到了大量的时间。
* 早恢复,就是要缩短故障恢复的时间,降低故障对数据产出的影响。
那具体如何做到这两个早呢?我总结了一套数据质量建设的方法,包括这样几个内容。
#### 添加稽核校验任务
在数据加工任务中,对产出表按照业务规则,设计一些校验逻辑,确保数据的完整性、一致性和准确性,这是提升数据质量最行之有效的方法。
通常建议你在数据产出任务运行结束后,启动稽核校验任务对数据结果进行扫描计算,判断是否符合规则预期。如果不符合,就根据提前设定的强弱规则,触发不同的处理流程。
如果是强规则,就立即终止任务加工链路,后续的任务不会执行,并且立即发出电话报警,甚至我们要求,关键任务还要开启循环电话报警,直到故障被认领;如果是弱规则,任务会继续执行。但是存在风险,这些风险会通过邮件或者短信的方式,通知到数据开发,由人来进一步判断风险严重程度。
![](https://static001.geekbang.org/resource/image/06/ea/06243ebbbfa6b46fc61803c84cb8edea.jpg "图5 稽核校验执行流程图")
那具体要加哪些稽核规则呢?
* **完整性规则。**主要目的是确保数据记录是完整的不丢失。常见的稽核规则有表数据量的绝对值监控和波动率的监控比如表波动超过20%就认为是异常。还有主键唯一性的监控它是判断数据是否有重复记录的监控规则比较基础。除了表级别的监控还有字段级别的监控比如字段为0、为NULL的记录
* **一致性规则。**主要解决相关数据在不同模型中一致性的问题。商品购买率是通过商品购买用户数除以商品访问uv计算而来的如果在不同的模型中商品购买用户数是1W、商品访问uv10W商品购买率20%,那这三个指标就存在不一致。
* **准确性规则。**主要解决数据记录正确性的问题。常见的稽核规则有一个商品只能归属在一个类目数据格式是不是正确的IP格式订单的下单日期是还没有发生的日期等等。
它们是强规则还是弱规则,取决于业务对上述异常的容忍度(比如涉及到交易、支付跟钱相关的,一般都会设置为强规则,对于一些偏行为分析的,一般都是弱规则)。
#### 建立全链路监控
在06讲中我强调数据中台的模型设计是分层的确保中间结果可以被多个模型复用。
不过这会导致数据加工的链路变长,加工链路的依赖关系会非常复杂,最终当下游表上的某个指标出现问题,排查定位问题的时间都会比较长。**所以,我们有必要基于数据血缘关系,建立全链路数据质量监控。**
![](https://static001.geekbang.org/resource/image/4e/02/4e2f5518a2273a0295352eae7f2a4c02.jpg "图6 全链路数据质量监控")
从这个图中你可以看到,业务系统的源数据库表是起点,经过数据中台的数据加工链路,产出指标“黑卡会员购买用户数”,数据应用是链路的终点。
对链路中每个表增加稽核校验规则之后当其中任何一个节点产出的数据出现异常时你能够第一时间发现并立即修复做到早发现、早修复。另外即使是使用方反馈经营分析上的黑卡会员购买用户数相较于昨天数据大幅下降超过30%,你也可以快速判定整个指标加工链路上节点是否运行正常,产出任务是否有更新,提高了问题排查速度。
#### 通过智能预警,确保任务按时产出
在数据质量问题中我提到会存在物理资源不足导致任务产出延迟的情况。在网易所有数据中台产出的指标要求6点前产出。为了实现这个目标我们需要对指标加工链路中的每个任务的产出时间进行监控基于任务的运行时间和数据血缘对下游指标产出时间进行实时预测一旦发现指标无法按时产出则立即报警数据开发可以终止一些低优先级的任务确保核心任务按时产出。
#### 通过应用的重要性区分数据等级,加快恢复速度
稽核校验会消耗大量的资源,所以只有核心任务才需要。核心任务的定义是核心应用(使用范围广、使用者管理级别高)数据链路上的所有任务。
#### 规范化管理制度
讲到这儿,你可能会问:数据质量取决于稽核规则的完善性,如果数据开发没有添加,或者添加的规则不全,是不是就达不到早发现、早恢复?
这个问题戳中了要害,就是规则的完备性如何来保障。在我看来,这不仅仅是一个技术问题,也涉及管理。在网易,我们会制定一些通用的指导规则(比如,所有数据中台维护的表都需要添加主键唯一性的监控规则),但这些通用规则往往与业务关系不大。如果涉及业务层面,就要由数据架构师牵头,按照主题域、业务过程,对每个表的规则进行评审,决定这些规则够不够。
那我想建议你,如果要做稽核校验,可以通过组建数据架构师团队,由这个团队负责核心表的规则审核,确保规则的完备性。
那么当你按照这几个方法建立了数据质量体系之后,要如何验证体系是否有效呢?
## 如何衡量数据质量?
做数据治理,我一直奉行“效果可量化”的原则,否则这个治理做到什么程度,很难衡量。那么如何评价数据质量是否有改进呢?除了故障次数,你还可以有这样几个指标。
* 4点半前数据中台核心任务产出完成率。这个指标是一个综合性指标如果任务异常任务延迟强稽核规则失败都会导致任务无法在规定时间前产出。
* 基于稽核规则,计算表级别的质量分数。根据表上稽核规则的通过情况,为每个表建立质量分数,对于分数低的表,表负责人要承担改进责任。
* 需要立即介入的报警次数,通常以开启循环报警的电话报警次数为准。对于核心任务,任务异常会触发循环电话报警,接到报警的数据开发需要立即介入。
* 数据产品SLA。每个数据产品上所有指标有没有在9点产出如果没有开始计算不可用时间整体可以按照不同数据产品的重要性进行折算99.8%是数据产品一个相对比较好的SLA。
不过,技术和规范最终需要依靠产品来帮助落地,在网易内部,有一个数据质量中心的 产品,通过介绍这个产品,我希望能给你一个参考,如何去设计一个数据质量中心,或者在选型的时候,数据质量中心必须具备的功能。
## 数据质量中心
数据质量中心以下简称DQC的核心功能是稽核校验和基于数据血缘的全链路数据质量监控。
![](https://static001.geekbang.org/resource/image/f3/b1/f39b371750e39eabde620ced05d0f0b1.jpg)
DQC的首页是质量大屏提供了稽核规则的数量、表的覆盖量以及这些规则的执行通过情况。通过这些数据你就能跟你的老板讲清楚目前数据质量水平建设如何目标是多少距离目标还有多少差距。
![](https://static001.geekbang.org/resource/image/70/ef/702ec67c9cb0f5b572a64af4289c31ef.jpg)
在DQC 中创建稽核规则非常简单DQC 内置了大量的基础规则例如IP 字段格式校验主键唯一性校验表行数波动率校验同时还提供了自定义SQL的方式允许业务层面的规则创建例如我们前面提到的一致性规则中两个指标相除等于第三个指标就可以通过自定义SQL解决。
![](https://static001.geekbang.org/resource/image/dd/c6/dd914160281cd1872eedb0717fb6c6c6.jpg)
DQC 还提供了全链路监控的功能,覆盖了从数据导入、数据加工、模型产出、指标、到数据应用的完整链路。绿色节点代表数据正常,蓝色节点代表数据正在产出中,红色节点代表数据异常,灰色节点代表产出任务还未被调度到。通过这个监控,大幅提高了问题发现和定位的速度。
所以你可以发现一个好用的DQC 必须要具备的功能就是质量度量、稽核规则管理以及全链路监控。
## 课堂总结
本节课,我从数据质量问题的根源入手,带你分析了背后的原因,和五种提高数据质量的方法,在课程结束前,我再强调几个重点:
* 数据质量治理必须要做到全链路,从业务系统的数据源到指标所在的应用,这样可以提前发现问题,将故障消灭在摇篮中;
* 根据应用的优先级和全链路血缘关系,圈定核心任务,要确保核心任务的稽核规则全覆盖,优先保障核心任务的按时产出,在资源紧缺时,有必要停止非核心任务;
* 稽核规则的完备性,可以通过数据架构师团队对每个域下的核心表进行评审的方式保障,同时问题回溯和复盘,也可以不断地完善。
![](https://static001.geekbang.org/resource/image/33/6c/33c40b8caedcd08edf50efeddbe6f26c.jpg)
## 思考时间
我提到数据完整性可以通过数据记录的波动率来监控如果超过20%的波动,应该被视为异常。但是你有没有想过,这种也存在误判的情况,尤其是在双十一大促期间,大概率数据稽核规则都是异常的,此时你又该怎么办?
最后,感谢你的阅读,如果这节课让你有所收获,也欢迎你将它分享给更多的人。