0、背景
故事的开头,是一位业务部门的同事找到我们,咨询了一个经典问题:
「需求方经常说我们做的报表看起来数据不准,有什么办法吗?」
为了解释这个问题,我以我们团队在数据质量管理中积累下来的方法,为他写下四行字:
-
数据质量期望——业务需求想要把数据质量保障到什么样的标准
-
数据质量测量——怎么评估数据质量水平的高低、是否达到标准
-
数据质量保障——为提升质量水平,达到质量期望,具体的保障实施动作和内容
-
数据质量运营——如何通过数据化运营,提高保障的成果与效率
这四行字,概括了我们在数据质量管理执行中的理论大纲。
一、数据质量期望
「你在需求沟通时,了解对方的数据质量期望么?」
数据质量是由需求定义的。它没有绝对的对与错,只有定性、定量的标准。我们需要事先了解需求方的质量期望,才能与需求方就「质量达标」的标准达成细节上的共识。
我举个例子,我们经常遇到一种情况:我们明知这份数据存在问题,但依然选择使用它。只要我们把这份数据的问题点抛出,下游消费者理解并接受它的问题、并做好兜底方案即可。这种方式,是通过主动降低质量期望来避免数据事故。
要如何知晓对方的质量期望?
最好不要直接询问:「你需要怎样的保障,怎样的监控?」因为需求方不一定是专业的开发人士,他们可能会遗漏,或者,他们无法用运维语言来表达。
于是我们设计了以下三组问题,在日常的数据需求沟通中,主动向需求方提问确认:
第一组:获得质量期望
问题 | 作用 |
这个需求的业务日标是什么?为何重要?是否与线相关? | 铺助判断是否有造成资损的风险 |
谁将在下游使用它?是以什么形式使用?并且用在娜里的? | 辅助判断是否用于线上服务,对用户有影响 |
这份数据被使用后,将会支持哪些业务分析场景?娜些业务流程?支持的逻辑是怎样的? | 铺助判断是否影响公司的重要决策 |
这个需求的逻辑是否涉及一些用户隐私、未成年人等信息? | 辅助判断是否有安全风险 |
如果这份数据未及时产出/发生流,会有什么影响,什么损失? | 铺助判断时效性要求 |
如果这份数据发生丢失或重复,会有什么影响,什么损失? | 辅助判断完备性要求 |
如果这个字段值缺失/错误,会有什么能响,什么损失 | 辅助梳理字段监控要求 |
第二组:评估可能存在的风险
问题 | 作用 |
我们从什么来源获取数据?数据源有文档吗? | 评估数据源是否有明确的责任归属 |
数据源自身是否有原生的异常数据,异常情况如何?会导致数据不可用吗? | 评估数据源的业务稳定性 |
数据源的服务等级是多少?符合我们对这份数据的重要性定义吗? | 评估数据源的保障能力 |
数据源有充足的粒度、维度字段、度量字段来满足需求指标的产出吗? | 评估数据源应对需求的能力 |
若这份数据源不符合要求,能改进吗?有替代数据源吗?能通过ETL修正吗… | 评估数据开发中的兼容难易度 |
当然,对于风险的评估,上述问题只是冰山一角。
第三组:与需求方沟通一下业务知识认知
问题 | 作用 |
需求方知道这份数据源对标的是线上的哪个功能、哪个业务流程吗? | 确认我们与需求方对业务流程的认知一致 |
需求中提及的指标。有权成的口径定义吗?如果有,他们了解吗?如果没有, | 确认我们与需求方的指标定义认知致 |
要如何定义? | 需求中提及的雄度、及其维度属性,有统一的数据标准吗?如果有,他们了解 |
确认我们与需求方的雄度定义认知一政 | 吗?如果没有,要如何定义? |
这些问题很容易想当然,同时,也是相当致命的。比如说,需求方需要视频稿件的CTR,恰巧我们早已做好了CTR指标,便直接提供给他使用了。但如果这位需求方理解的CTR和我们的统计口径不一致呢?他得到了他期望的数据吗?
质量期望的沟通,在什么时机最合适?
从实践中我们得出,获得质量期望的最佳时机,是在需求沟通阶段。这个阶段还没有大量资源、人力的投入,发生需求变故的成本最小。
所以我们将质量期望的信息收集安排在需求预审环节。把上述三类问题组织成一个预审沟通模板,要求每一位参与需求预审的数据开发人员养成询问质量期望的习惯。
经此沟通,能够让需求方有准确的业务认知,能够建立我们与需求方、上游业务研发、下游消费者之间的质量期望与风险知晓的共识,能够引导需求方降低质量期望,或引导业务研发消除当前的风险。
二、数据质量测量
「你知道怎么评估数据质量水平的高低,判断质量是否达标吗?」
既然数据质量没有绝对的对与错,只有可定性、定量的标准。那么表达数据质量水平的方法,就是与标准所包含的规则做测量对比。可以称之为数据质量测量。
既然要测量,我们首先要先设计测量规则。
规则的设计,决定了我们在质量测量过程中能够发现哪些问题、不能发现哪些问题。我们首先要明确哪些问题的暴露是需要的,哪些是不需要的。我们将规则拆分为基础规则与个性化规则。
- 基础规则:指可对大部分数据通用的规则。如,条数为0监控、主键重复监控等,这类异常在大部分场景都应当被暴露。基础规则通常无须自行设计,平台会提供统一的配置,来保障基础规则的覆盖。
- 个性化规则:指每一份数据根据实际用数情况,做针对性设计的规则。个性化规则要从质量期望中去提炼。我们用一个真实(经脱敏修饰)的质量期望案例来说明这个提炼过程。
我们有一份源自客户端上报的【业务对象曝光与点击日志】,它的下游消费者众多,我们从消费者的质量期望中合并出一份最高期望(取规则的并集,且每个规则取要求最高的一项)。
【业务对象曝光与点击日志】质量期望与规则提炼实例:
总得来说,质量期望一般来源于:
(1)场景和对象的特殊性
(2)业务流程和数据生产逻辑
(3)数据标准
(4)数据自身特点
(5)某时某地的业务背景。所以我们的测量规则也基于这些提炼。
2.1 测量规则
规则又可以拆解为两个部分:规则指标、规则判定。
比如【传输丢失率<某阈值】这条规则中,【传输丢失率】为规则指标,【<某阈值】为规则判定。
规则指标分类及举例:
规则类型 | 规则的意义 | 规则指标举例 |
完备性 | 数据在上报与传输过程中是否保持完好(既不能少,也不能多)。 | 传输丢失苹、传输重复草等 |
时效性 | 数据生成与消费之间的时问距离。所产生的决策效果的差异性。 | 日朔漂移、到达廷迟等 |
准确性 | 数据生成与触发机制符合定义,属性的填值符合业务逻辑。 | 准确率(通常是测试环节评估) |
唯一性 | 当数据有业务意义上的唯一键时,真实唯一 | 唯一键重复率等 |
一致性 | 业务对象不同属性间的逻辑一致、同一属性在不同数据中的一致、两个业务过程量级、被动趋势的一致。 | 跨表和值对比、波动一致对比等 |
完整性 | 行数据中,应当填入的属性都己填值。没有缺失。 | 字段空值、0值等 注意:完整指的是业务意义上的完整,如果0值有明确的业务意义(如某种度量、某个枚举),那么0值的出现不能说明数据不完整 |
规范性 | 属性值符合这个属性所绑定的某类规范。 | 枚举、范围、值域、格式、精度等 |
规则判定分类:
判定类型 | 逻辑说明 | 表述 |
无命中 | 要求没有任何一条记录命中,有则为异常 | 异常指标 = 0 |
绝对值 | 命中规则的记录数/比例应当是己知的、恒定的,不符合则为异常 | 异常指标 = 某绝对值 |
范围值 | 命中规则的记录数/比例应当在一个值范围内,不符合则为异常 | 异常指标 in 某阀值范围 |
设计好规则,还要明确在什么时机做质量测量。
2.2 测量时机
我们把测量的时机分成三种,对应三种测量形式:初始化测量、验收测量、生产测量。
为了让这三种时机融入到团队的开发工作中,我们将这三个时机与数据需求管理的流转步骤挂钩,要求需求流转的交付内容中包含三次测量的执行报告。
-
初始化测量:
发生在数据需求的预审期、或开发前期。以一次性数据探查的形式,探查一份新数据、或老数据的新属性存在的潜在风险。这些风险可能是业务逻辑中的缺陷、或者未做标准化定义的隐患等,所以我们除了关注数据自身的测量结果,还要关注文档等上游信息输入。
初始化测量,帮助我们规避低质量数据输入到我们的生产链路。
-
验收测量:
发生在数据需求的验收期。不但全新的数据需要全方位验收,变更需求同样需要。根据我们的事故经验,超过90%的数据质量事故,是由变更发布带来的。
验收测量,帮助我们规避变更发布带来的数据异常。
-
生产测量:
生产测量的配置和首次执行发生在需求交付前观察期,日常执行发生在交付后的日常生产过程中。稳定的生产链路理论上有稳定的质量,但不可忽视偶发性的不稳定问题,比如底层组件异常、调度服务异常等。
生产测量,帮助我们规避外界偶发性问题影响数据的产出。
有了质量测量,我们可以随时通过规则的统计与判定,来长期监控质量水平、及时发现异常问题。
三、数据质量保障
「如果质量测量的结果不理想,要做哪些事才能提升质量水平?」
数据质量水平的提升,是经由数据质量保障的实施才能实现的。这个「保障」具体要保障什么?做哪些事来保障?
质量测量的规则是根据质量期望来设计,那么相应的,测量报告中的指标异常,也要能告诉大家哪一条期望没有达标。我们应当先针对未达标的期望来做保障的实施。
我们延续上一小节的【业务对象曝光与点击日志】,来说明发现问题后保障实施的过程。
在质量期望中,对f5这个属性有这样一条期望描述:
而在真实的数据中,测量报告表明f5属性的质量并没有达到期望。即,f5这个属性存在大量空值。
由于这是数据源日志,尚未经过ETL处理,可认为f5属性异常发生在数据上报和数据集成接收的环节,再加上其他判断条件,我们基本认定这个异常发生在上报环节。通过对异常数据的统计分析,进一步定位到这个异常只发生在某几个页面,其余页面都是正常的。接下来,我们就要做两项实施来修复异常且使它不再发生:
-
根据埋点异常修复流程,由客户端修复这个上报异常。
-
在测试环节补充这条测试用例,在后续的变更中,可通过该测试用例阻截异常。
在这个case中:
首先,我们有质量测量来监控数据的质量水平;
其次,我们有异常修复流程来修复它,解决本次问题,也有变更流程来测试它,避免同样的问题再次发生;
接着,我们有明确的责任制度,在上述流程中,各个责任方知晓自己的执行责任;
最后,我们的各个责任方,有拨冗相应的人力工时资源,来将这个埋点的监控、修复、测试工作落地。
我习惯将质量保障的实施分为四个类别,缺一不可。
3.1 质量保障实施类别
3.1.1 流程保障
为何要有流程?
在安全管理领域,极度注重标准操作流程的制定和实施。飞机乘务员关闭舱门的操作、化工厂转运化学品的操作,都有严格的标准操作流程,而这些流程强大到能够保障人员的生命安全。可见,流程保障是一种强有力的保障措施。
在我们的流程保障中,需要重点讲述的是数据准入、发布变更这两个流程。
数据准入:
曾经发生过一个case,有一个新的产品A,在做埋点上报开发时,直接copy了另一个产品B的上报脚本,导致用以区分这两个产品的关键属性appid上报为同一个值,从而影响了产品B的核心指标。
在这次case的复盘中,我们提出,任由一个新产品、新场景随意接入既存的重要埋点,显然是不合适的。因此我们建立了数据准入流程。
准入流程的建立依赖几个必要条件:
-
经由准入流程分配的属性值,须做双向绑定验证(上报侧与埋点管理侧)。
-
经由准入流程分配的属性值,上报时须由SDK或公共组件(如播放器)收敛,不可由接入业务自行填值上报。
-
未经准入的数据,须能限制上报、或在上报后被限制接收、使用。
最终实际的流程参考下图:
发布变更:
超过90%的数据质量事故是由变更带来的,这是我们在聊验收测量时提到的一个事实。为此,发布变更必须有一套流程来保障。
如图所示,是一个简略的埋点变更的流程。
3.1.2 制度保障
运维责任制度是必须存在的。它定义了每一份数据、每一类组件、每一项服务的责任归属认定逻辑,能够确保任何数据在各个环节都有其质量保障的执行负责人。
运维分级制度也是必须存在的。它定义了每一份数据在全生命周期的各个环节,能得到哪一层标准的保障,且高等级数据一定能获得比低等级数据更稳定的保障。
我们对分级的定义,会从以下几个方面来评估:
-
涉及财报、营收、资损
-
涉及业务重大决策
-
涉及线上功能服务与用户体验
-
涉及有关部门监管内容
事故处罚制度是可以选择的制度(当然我们推荐它存在)。它定义了异常发生后的过失成本。
我们的事故定义、事故等级的划分,会从多种指标来评估:
-
资损的量级
-
客诉的量级
-
数据异常的幅度和时长
-
数据的可恢复性
-
数据异常的影响PV、UV
-
数据修复的人力工时成本
此外,在新的周期,我们也吸收了前几个周期的经验,除了消极压力的处罚制度,还考虑增加积极鼓励的奖励制度。
3.1.3 监控保障
我们认为监控保障包含了四项工作:
1. 监视、监听:长时间观察数据生产的健康情况;
这个健康情况,包含大数据组件的稳定性、大数据资源使用用量、任务运行状态、数据产出结果的校验等。
2. 测量:即我们在前文所指的质量测量;
3. 督促:促使相关责任方去处理问题;
通常,通过群消息推送、企业微信告警、电话告警等不同等级的信息通知来实现。
4. 纠偏:辅助执行问题的处理。
告警原因分析、任务阻断等功能,就属于这一类。
3.1.4 资源保障
资源保障指的是针对不同运维等级的资源倾斜,且这里的资源包含两重意义:
-
物理资源:CPU和内存,磁盘容量,带宽等。
-
人力工时资源:测试、校验的执行排期、运维响应速度、异常修复顺序等。
继续回到【业务对象曝光与点击日志】这份数据,来看一看我们对它的上下游链路实施了哪些保障。
把上述四类保障建设完成,那么我们的数据质量保障体系就完成了从「0」到「1」的过程。
四、数据质量运营
「单份数据可以人工跟进保障实施情况,但成千上万的数据,怎么知道每一份数据该怎么保障、有没有实施、实施效果好不好呢?」
我们来思考一下执行质量保障措施的目的是什么。质量保障的实施,其目的在于规避异常,它需要在每个上游环节中:发现异常、拦截异常、处理异常
由此可见,它的基础标准应当是:确实发现了异常、确实拦截了异常、确实处理了异常;以达到最终节点规避异常的目的。
我们继续思考,谁,在什么时机,通过什么方式,消耗多少人力工时,会造成多少损失?
任何一个人都希望能规避所有异常,且即使真的发生异常,也能在造成损失前处理完毕。那么,我们要进一步提升它的标准:
-
在有限的测试、验收工时里最大程度拦截异常发布
-
上游比下游先一步发现异常
-
异常的告警最早通知到能处理这个异常的人
-
在人力介入之前,系统率先自动拦截异常
-
处理人员以最短路径、最小成本处理异常
-
不让同样的问题再一次重复发生
可以看到,质量保障的基础要求体现在通过保障避免损失,进阶要求体现在保障效率的提升。我们由此得到数据质量运营的两个运营目标:降低事故损失和提升保障效率
作为数据工作者,我们理所当然要通过数据化运营来实现我们的目标。为此,我们设计了质量运营的指标体系。
我们的质量运营指标体系是基于我们的治理指标体系建设模型,包含:治理目标、治理策略、治理评估。下述为我们最近几个周期质量运营指标体系的概图。
其中,治理策略矩阵代表着,我们需要对生命周期中每一个环节的事前、事中、事后,都去制定保障标准、设计执行策略的规则,以及提供相应的工具能力。
4.1 制定保障标准
标准是一个执行参照。
告诉所有人怎样算达标,按什么流程最安全……等等。标准统一了我们在质量保障执行过程中的意识和行为,杜绝责任推诿。
保障标准来源于各类质量期望的汇总,其中公共的、通用的部分,应对所有用户公示。它可能会经历谈判、妥协,最终达成意见的一致。它包含并不限于:
-
服务SLA标准
-
测试/监控覆盖标准
-
异常响应时效标准
-
资源划分标准
标准需要分级,不同运维保障等级,映射到不同的保障标准值。
团队的人员精力、物理资源都是有限的,要在有限范围内保障最重要的部分。
比如我们在前文提到的【业务对象曝光与点击日志】这份数据,依照运维分级制度,属于P0级。作为P0等级的数据,其数据时效保障为1分,响应时效要求是15分钟。而其他P1级甚至更低等级的数据,时效标准就会逐级放低。
4.2 设计执行策略的具体规则
规则是标准展开的细则。
比如我们将事件处理标准流程展开,当异常发生时,我们的标准流程是先止损、再修复。基于这个标准,假设【业务对象曝光与点击日志】这份数据在某个环节出现异常,我们的细化规则是:
-
该环节的异常处理人必须直接收到告警,并在10分钟内响应;
-
10分钟内无响应,会上升至技术LD;
-
收到告警后,先通知到能够做灾备切换的人员(最快、最短链路),再将信息同步到该项目的应急响应群;
-
异常处理人说明异常原因,评估修复耗时;
-
根据该项目的灾备启动条件,灾备执行人判断是否启动灾备方案;
-
修复问题;
-
切回主方案。
这些规则使大家远离误操作,提高执行效率。也能让一个新人快速上手,降低执行难度。
另外从中我们也看到,这项事件处理规则有几个前提规则:
-
需要有全链路的监控覆盖
-
需要有灾备方案
-
需要有告警升级机制和通知机制
4.3 提供工具能力
目前,我们已经积累了一批工具,用于数据生命周期的各个环节,提供自动执行能力。
比如监控告警工具、基线管理工具、DQC管理工具、指标异动工具、运维操作工具等,可以在公众号的其他文章中获得详细了解。
策略的执行需要评估效果好坏,以随时调整策略规则、或改进工具能力。如何评估策略的执行效果,就需要我们做评估指标的设计。
评估指标的设计原则:
- 必须从第一层目标指标拆解而来,
- 能够暴露出现状中的问题点,
- 能够评估治理策略的执行进度,
- 能够评估效果收益
这样的设计,使运营工作处于一个从指标中发现问题-问题解决后体现在指标中的持续性循环中,不断逼近、最终完成目标。
在前面的质量运营指标体系概图中,我们先将目标指标(事故次数)拆解为与事故直接相关的事故定级指标。
定级指标的值幅度降低,则事故次数就降低。
那么,接下来我们要拆解定级指标的降低与哪些执行指标相关,这一步拆解,要与策略规则直接绑定。因为无法评估效果的规则,在执行上很难有说服力,不容易落地。
测试覆盖率,与测试用例的实施绑定;监控覆盖率,与监控配置的实施绑定;修复人时,与运维工具的提效优化绑定……诸如此类。
其中概念较抽象的指标,如监控覆盖率这一项,它贯穿全生命周期,且在不同环节有不同的口径定义。
比如在数据开发环节,我们要求所有P0级数据必须配置三大类监控告警(失败、延迟、内容异常),且告警形式为电话告警 + 部门内升级。这些配置规则缺一不可,只有全部完成,才计作这份数据的“监控覆盖完成”。通过每周审计监控覆盖率,来控制我们在数据开发环节的监控保障实施。
在这里,有一个告警有效性运营的真实案例,能够解释我们的数据化运营方式。
先介绍一下背景,我们认为,监控不是越多越好,且需要随着业务变化及时调整监控规则。告警太多,会干扰执行人员的运维关注点,对告警产生麻痹或抵触情绪,乃至错过关键告警,降低异常发现率。
我们首先要确定在这个运营事项中,一个可持续的循环是怎样的。根据前面提到的指标-问题-标准-实施循环图,我们简单列举一下这个循环:
-
指标:需要有指标来暴露无效、未响应、缺失、越级等告警缺陷
-
问题:将这些缺陷视为一个待治理的问题
-
标准:定义有效告警的标准
-
实施:制定降低告警缺陷、提升有效告警的策略
为了便于理解,我先解释一下告警效果的定义。
有效告警:命中规则,且确实命中异常,同时能促使处理人员快速介入。
无效告警:命中规则,但并未命中异常,通常是规则配错、或业务活动导致。
未响应告警:命中规则,且确实命中异常,但无人响应,或响应人员无法、无权介入处理。
越级告警:数据运维等级较低,但配置了标准较高的告警形式,使起夜次数虚高。
误告:未命中规则,工具误触发告警。
告警缺失:发生异常,但无告警。
第一步,制定告警反馈机制,督促owner对告警进行分级反馈。
第二步,建设告警模块的元数据主题数仓,制作告警缺陷统计报表,给出待治理明细清单,推送治理信息给清单中的数据owner。
第三步,制定有效告警标准、执行细则,督促owner给出治理优先级,确定短期长期治理目标。细则参考下图:
第四步,定期审计告警缺陷,更新待治理清单,分析执行进度、治理余量、新增量的情况,逐步完成头部高优的部分。
第五步,工具优化方案提出,阻截不合理新增量、自动化处理长尾余量部分。