这张图片是由作者创作的.
简两周前我在我的通讯中发表了这篇文章。免费订阅_ https://vutr.substack.com,即可更早地在你的邮箱里读到我的文章。
如果你一直关注我的文章,你可能已经注意到我花了很多时间探讨OLAP系统的技术细节、表格格式以及大公司是如何管理其数据基础设施的。
我主要关注的是“工程”方面,似乎忽视了“数据”——对于每天与数据打交道的人来说,数据是最关键的部分之一!
于是,我决定花更多时间学习和撰写有关“数据”本身的内容,如数据建模、管理、质量和更多内容。
您在我的网站上读到的第一篇关于“数据”的文章就是这篇文章。
但愿这不会是最后一个……
今天,你和我将一起看看Uber是如何确保数据质量的。
概览优步公司广泛利用数据,在世界各地提供高效可靠的运输服务,这些服务和模型得到了数百种服务、机器学习模型和数千个数据集的支持。
作为一家数据驱动的公司,糟糕的数据会显著影响运营——这一点优步比大多数公司体会得更为深刻。
作者画的这张图。
为了处理这个问题,他们建立了一个集成的数据质量平台,该平台不仅监控,还自动检测并管理数据质量问题。这个平台支持2,000多个数据集,检测出大约90%的数据质量问题。
以下部分将探讨 Uber 如何制定数据质量标准并构建一体化工作流程以达到运营卓越。
难题为了处理优步如此大规模的数据并解决其中的数据质量问题,他们不得不面对并解决以下问题。
作者自己画的图。
- 各团队之间没有统一的数据质量衡量标准。
- 为数据集创建测试需要大量手动操作。
- 事件管理流程需要改进。
- 需要与其他数据平台集成,以便为所有Uber内部数据用户提供统一的使用体验。
- 需要一个标准化且自动化的警报生成方法。
以下是在过去Uber尝试收集内部数据使用者的反馈以及分析重要数据事件过程中遇到的一些常见数据问题:
- 迟来的数据
- 数据丢失或存在重复
- 不同数据中心的数据不一致
- 数据值错误。
根据这些洞察,他们定义了下面提到的测试类别,旨在涵盖数据质量的各个方面。
作者自制的图片。
- 新鲜度: 数据达到99.9%完整所需的时间
断言通过如果当前时间戳小于新鲜度SLA,并且数据完整度达到99.9%的最新时间戳值
- 完整性: 行完整率。
断言通过当 downstream_row_count / upstream_row_count > 完整性 SLA 值
- 重复行: 拥有重复主键的行所占的百分比
断言通过,如果 (1 — primary_key_count) / total_row_count < 允许的最大重复比例 SLA(服务水平协议)
- 跨数据中心一致性:通过比较当前数据中心的数据集副本和另一个数据中心的副本,来计算数据丢失的百分比。
_> 断言成功当 min(row_count, row_count_other_copy) / rowcount > 一致性 SLA
- 其他:任何涉及基于业务逻辑的复杂检查的测试。
数据质量平台的架构基于用户的自定义测试项
从整体来看,优步的数据质量架构方面主要包括以下几个组件:
这张图片是作者自己绘制的。
- 测试执行引擎
- 测试生成器
- 警报生成器
- 事件处理器
- 平台成功度量
- 使用工具
测试执行引擎根据预设的时间表或按需通过各种查询引擎运行已部署的测试,并将结果存储在数据库中。其他组件则利用此引擎来覆盖整个数据质量生命周期的各个环节。
测试生成器小工具作者的图片如下所示。
此组件旨在自动生成“数据质量标准”部分中定义的标准测试。这些测试是通过从Uber的集中式元数据服务获取的数据集元数据生成的。自动生成测试时需要的关键字段包括数据集的服务水平协议(SLA)、针对只测试最新数据分区的大表的分区键和主键。
Uber 还支持为所有上游和下游表格自动创建测试,利用内部的数据血缘服务。Uber 创建了一个每日的 Spark 任务来获取最新的血缘信息来支持这项功能。该任务还会更新所有自动生成的测试定义,以反映任何元数据更改,并相应地更新测试生成逻辑。
测试运行引擎基于Celery的网络服务支持每天大约100,000次执行,涉及约18,000个测试。测试可以自动生成或由用户定义。每个测试都有一个断言条件,断言必须为真才能通过。
这些测试可以简化为几个逻辑断言式。最基本的是将计算值与常量进行比较。另一个常见的模式是将一个计算值与另一个计算值进行比较。Uber 观测到,大多数数据质量检验都定义为这两种简单的模式之一。
优步使用断言模式来构建测试表达式,这是一串表示可以解析的指令的符号。
这个字符串是一个扁平化的抽象语法树结构,其中包含表达式和控制执行的参数。在执行过程中,表达式被解析为一棵树,并进行评估,通过后序遍历。用这种方法,每个测试都可以被表示成一个 AST,并由执行引擎进行处理。
警报提醒器警报也可以根据模板和业务规则自动生成。该过程还需要从元数据服务中获取额外的参数,例如表的所有者或警报邮件。Uber会基于测试执行引擎生成的结果,为每个数据集(如表A或表B)和每个测试类别(如新鲜度或完整性)创建警报。此外,Uber的工程师还需要避免误报,并提供良好的用户体验。
Uber引入了一个持续时间段,表示SLA指标允许在一定时间内有测试失败。如果测试有一个3小时的持续时间段,平台将状态设置为WARN,直到测试失败超出该持续时间段。
即使对于真实警报,过多的警报也可能让用户感到不堪重负。例如,当数据延迟到达的时候,新鲜度警报会被触发,同时完整性和跨数据中心一致性警报也很可能被同时触发——一个问题是可能触发三个警报。
Uber 试图通过将状态更新警报默认设置为其他类别的依赖项来限制警报数量,因此其他警报将不会被处理,以避免重复通知相同的问题。
事件处理专员事件管理的工作流程。图5所示,Uber如何在数据质量体验中实现运营卓越(2021年)
在用户收到警报、找出根本原因并解决了相关问题之后,Uber 添加了一个内部调度器,以自动重新运行失败的测试,并采用指数回退。这样一来,当测试通过时,用户可以确认问题是否已经解决,并且可以自动解决警报,无需人工干预。
Uber 还开发了一个工具,允许用户标注一个事件或情况并手动触发重新运行过程。用户可以在使用或处理数据时报告他们发现的任何事件,数据质量平台会检查报告的事件是否与自动检测到的事件重叠。数据生产者收到通知后需要确认事件。Uber 将自动检测到的和用户报告的事件进行汇总,以确保最终的数据质量状态全面反映所有质量相关因素。
消费用品Uber 还提供了各种工具,帮助用户了解数据集的质量。
这张图片是我自己创作的。
- Databook 是管理 Uber 所有数据集元数据的中心控制面板。Uber 将质量平台与 Databook 集成,以便在 UI 中展示数据质量结果。
- Uber 拥有一个查询运行器工具,可以访问任何数据存储,例如 MySQL、Postgres 或 Hive。数据质量平台与该工具集成,以帮助用户查询质量状态。查询 API 接收数据集名称和时间范围,并验证查询时间范围是否与任何正在进行的数据事故重叠。
- ETL Manager 是所有 Uber 数据管道的控制器。它在管道完成之后可以调用数据质量平台立即触发新的测试执行,确保立即进行质量检查。此外,在安排数据管道之前,ETL Manager 可以使用其输入数据集的品质结果。如果任何数据集的品质未达标,ETL Manager 将不会运行该管道。
- Uber 拥有一个指标平台,它综合了业务指标定义,并使用原始数据集计算并提供指标。数据质量平台通过为指标平台的查询层定义特定的标准测试并提供每个指标的品质,与指标平台紧密集成。
谢谢读到这里。
在本文中,我们研究了 Uber 如何在各个内部团队之间建立数据质量标准体系,并构建了一个能够高效测试 Uber 的海量数据集质量的平台。
下回博客见。
参考资料[1] Uber Engineering Blog,优步如何实现操作卓越的数据质量体验(https://www.uber.com/en-VN/blog/operational-excellence-data-quality/) (2021)