数据赋能:Uber的数据治理实践分享
作者丨Krishna Puttaswamy、Suresh Srinivas
全文共7286个字,建议阅读15分钟
数据赋能 Uber
Uber 通过赋能数十亿打车和快递服务,连接数以百万计的乘客、企业、餐馆、司机和快递员,彻底改变了世界的出行方式。这个庞大的交通平台的核心是大数据和数据科学,它们支撑着 Uber 的所有工作,比如更好的定价和匹配、欺诈检测、降低预计达到时间(ETA)和实验。每天 PB 级的数据被收集和处理,成千上万用户根据这些数据进行分析决策,从而构建 / 改进这些产品。
规模扩展带来的问题
虽然我们能够扩展我们的数据系统,但以前,对于一些重要的数据问题,我们没有给予足够的关注,在规模扩大之后,它们变得更加重要,涉及的具体问题包括:
数据重复: 一些关键数据和指标缺少一个真实的数据来源,这导致了重复、不一致,并且在使用时会有很多困惑。消费者必须从解决业务问题中抽出时间来做大量的尽职调查,从而弥补这一点。使用自助服务工具创建的数十万个数据集加剧了这个问题,因为我们无法明显看出哪个数据集更重要。
发现问题: 如果没有丰富的元数据和分面搜索,在数十万数据集中发现数据是很困难的。糟糕的发现导致了重复的数据集、重复的工作和不一致的答案(这取决于回答问题时所使用的数据)。
工具互不连通: 数据流经许多工具、系统和组织。但是我们的工具没有相互集成,导致工作重复和糟糕的开发体验——例如,必须在多个工具之间复制粘贴文档和所有者信息;开发者无法自信地修改数据模式,因为不清楚它在下游是如何使用的。
日志不一致: 在移动设备上的日志是手动完成的;日志没有统一的结构,我们无法通过简单、一致的方法度量用户的实际行为,只能通过推断来判定(这低效且容易出错)。
流程缺失: 缺乏跨团队的数据工程流程,导致各个团队的成熟度不同,团队间没有一致的数据质量定义或指标。
所有权和 SLA 缺失: 数据集没有明确的属主——它们通常没有质量保证、错误修复的 SLA 不一致,电话支持、事件管理与我们对服务的管理方式相去甚远。
这些问题并不是 Uber 独有的——根据我们与其它公司的工程师和数据科学家的交流,这些问题很常见,特别是对于那些增长非常快的公司。由于服务故障 / 中断即时可见,所以我们对服务和服务质量的关注比较多,而对数据和相关工具的关注往往比较少。但在规模比较大时,解决这些问题,并使其与服务工具 / 管理的严格程度保持一致,变得极其重要,尤其是如果数据在产品功能和创新中扮演着关键角色,正如数据在 Uber 的角色一样。
需要一种整体的数据解决方案
下图显示了从移动应用程序和服务到数据仓库和最终消费面的高级数据流。我们最初只在数据流中出现数据问题的地方应急性地解决了这些问题的症状,而没有解决根本问题。我们认识到,需要一种整体的方案来解决这些问题,并彻底解决其根源。我们的目标是重新组织数据日志系统、工具和流程,从而逐步改变整个 Uber 的数据质量。我们召集了横跨端到端数据流堆栈的团队,其中包括来自堆栈各个部分的工程师和数据科学家,最终修改了 20 多个现有系统。
数据处理的基本原则
数据即代码: 数据应该作为代码对待。对数据工件的创建、弃用和关键更改应该通过设计评审流程,并使用适当的书面文档,而且是以客户视角编写的文档。必须为模型更改指定审阅者,他们在更改落地之前进行评审。模型复用 / 扩展优先于创建新模型。数据工件具有与之相关联的测试,我们要对其进行持续测试。通常,这是用于 API 服务的实践,在考虑数据时,我们需要同样严格。
数据要有属主: 数据就是代码,所有的代码必须有属主。每个数据工件必须有一个明确的所有者,一个明确的目的,并且在用完后废弃。
数据质量可知: 数据工件必须有数据质量 SLA,以及事件报告和管理,就像我们对服务所做的那样。所有者负责维护这些服务协议。
加速数据生产效率: 数据工具的设计必须可以改进生产者和消费者之间的协作,必要时必须有所有者、文档和审阅者。数据工具必须与其它相关工具无缝集成,让我们不必再考虑必要的元数据。数据工具应配备与服务相同级别的开发人员,提供在更改落地之前编写和运行测试的能力,在转入生产环境之前在准生产环境中测试这些更改的能力,并与现有的监控 / 告警生态系统很好地集成。
针对数据的组织: 团队的目标应该是“全栈”配置,因此,必要的数据工程人才就可以对数据的整个生命周期进行长期的观察。虽然更为核心的团队有复杂的数据集,但是大多数生成数据的团队应该以本地所有权为目标。我们应该有必要的培训材料,并优先培训工程师,使其相当精通数据的生产和消费实践。最后,团队领导应该对他们生产和使用的数据的所有权和质量负责。
Uber数据治理实践
新鲜度: 从数据生成到数据在目标系统中达到 99.9% 完成度之间的时间延迟,包括完整性水印(默认设置为 39 秒),因为只优化新鲜度而不考虑完整性会导致低质量的决策。
完整性: 目标系统中的行数与源系统中的行数之比。
数据重复: 具有重复主键或唯一键的行数百分比,在原始数据表中默认为 0% 重复,而在建模表中允许少量重复。
跨数据中心的一致性: 将当前数据中心中的数据集副本与另一个数据中心中的副本进行对比时,数据丢失的百分比。
语义检查: 捕获数据字段的关键属性,例如 null/not-null、唯一性、不同值的百分比和值的范围。
我们已经开发了自动化方法来为机构生成“分级报告”,显示需要分级的数据集、分级数据的使用情况等,作为机构的“数据健康”的衡量指标。我们还跟踪这些指标作为“工程卓越性”标准。随着越来越多的采用和反馈,我们不断迭代具体的定义和度量方法,进一步改进它们。
数据质量工具
如果我们不将这些定义自动化并使其易于使用和应用,仅仅拥有这些定义是不够的。我们将多个现有的数据质量工具整合到一个实现了这些定义的工具中。如果有意义,我们可以自动生成测试(对于原始数据,即由 Kafka 主题转储到数据仓库的数据,除了语义测试之外,我们还可以自动生成四类测试),并且通过最小化数据集所有者的输入简化了测试创建过程。这些标准检查为每个数据集提供了一个最小测试集,同时,该工具也为生产者提供了足够的灵活性,他们只需提供一个 SQL 查询就可以创建新的测试。我们学到了许多有趣的经验,包括如何以较低的开销扩展这些测试,如何简化为数据集构建一套测试的抽象,何时调度测试以减少误报和噪音警报,如何将这些测试应用于流式数据集,以及我们希望在以后的文章中发布的更多内容。
1. Databook 和元数据
基础元数据: 例如文档、所有权信息、管道、生成数据的源代码、示例数据、谱系和工件层
使用元数据: 关于什么人在什么时候使用这些元数据、流行查询和一起使用的工件的统计
质量元数据: 对数据进行测试,何时运行、哪些测试通过,以及数据提供的聚合 SLA
成本元数据: 用于计算和存储数据的资源,包括货币成本
Bug 和 SLA: 针对工件、事件、近期预警和总体 SLA 提交的 bug,从而响应所有者的问题
为了实现这个目标,我们对内部元数据目录 Databook 的后端和 UI 进行了彻底的改进。我们对元数据词汇表进行了标准化,使其易于向现有实体添加新的元数据属性,设计了扩展性,以便以最小的工作量轻松定义新的实体类型,并将我们的大多数关键工具集成到该系统中,并将它们的元数据发布到这个中心位置,把各种数据资产、工具和用户连接起来。改进后的用户界面更清晰,并且用户可以更方便地过滤和缩小所需数据的范围。经过这些改进后,工具使用量急剧增加。
使用上面的日志框架生成的数据,我们能够极大地简化对骑手行为的漏斗分析。我们在几个小时内就建立了一个仪表盘,这在过去可能需要几个星期的时间。这些数据目前正在为许多实验监控和其它仪表盘提供支持,让我们可以了解用户行为。
当我们启动 Data180 时,公司中有许多度量代码库。我们评估了这些解决方案的优缺点,并在一个名为 uMetric 的代码库上进行了标准化。事实上,它不仅仅是一个代码库——它具有高级功能,例如让用户专注于 YAML 格式的定义,并通过为不同的查询系统(例如 Hive/Presto/Spark)生成查询、为度量生成流式处理和批处理管道、自动创建数据质量测试等省去了大量的工作。这个系统正在得到更广泛的采用,我们也在投资进一步加强它。我们正在自动化重复和近似重复的度量检测,将此系统与 Databook 和其它数据消费界面集成,这样消费者就可以直接消费度量结果,而不是复制和运行度量 SQL(调整 SQL 更容易出错及导致度量重复),改进了自助服务的性质,并在事故发生之前检测到错误,等等。这种标准化帮助我们大大减少了消费时的重复和混乱。
跨工具集成:我们集成了工具,这样一旦在源工具上设置了文档、所有权和其它关键元数据,它就无缝地跨所有下游工具流动。我们将管道工具与标准告警和监控工具集成在一起,使服务和数据管道在生成和管理告警方面具有一致性。
后续工作
对工具进行了更多的基础性改进,实现了更多的自动化以支持不同的数据质量检查;实现了更多的集成以减少工作量
增强应用程序日志框架,进一步捕获更多有关用户在应用程序上实际“看了什么”和“做了什么”的直观信息
改进流程和工具,改善生产者和消费者之间的协作
对数据资产实施生命周期管理,以便从系统中移除未使用和不必要的工件
在工程师和数据科学家的日常数据开发流程中进一步应用上述原则
Krishna Puttaswamy 是 Uber 高级工程师。他在市场团队中处理各种数据和实验问题。这篇博客中描述的工作,是他在应用数据改进 Uber 应用程序和服务时所面临的实际问题的解决方案。他目前领导 DataNG 和一个重写实验平台的项目。他以前在 Airbnb 和 LinkedIn 处理过数据 / 机器学习问题。
原文链接:
end
公众号(zhisheng)里回复 面经、ClickHouse、ES、Flink、 Spring、Java、Kafka、监控 等关键字可以查看更多关键字对应的文章。