Apache|Uber 大规模运行 Apache Pinot实践

Pinot 是一个实时分布式的 OLAP 数据存储和分析系统。使用它实现低延迟可伸缩的实时分析。Pinot 从脱机数据源(包括 Hadoop 和各类文件)和在线数据源(如 Kafka)中获取数据进行分析。Pinot 被设计成可进行水平扩展。Pinot 特别适合这样的数据分析场景:查询具有大量维度和指标的时间序列数据、分析模型固定、数据只追加以及低延迟,以及分析结果可查询。本文介绍了 Pinot 在 Uber 的应用情况。
引言
Uber 有一个复杂的“市场”,由乘客、司机、食客、餐厅等组成。在全球范围内运营该市场需要实时的情报和决策。例如,识别延迟的 Uber Eats 订单或放弃的购物车有助于我们的社区运营团队采取纠正措施。对于日常运营、事件分类和财务情报来说,拥有一个包含不同事件的实时仪表板是至关重要的,这些事件包括消费者需求、司机可用性或城市中发生的行程等等。
在过去的几年里,我们已经建立了一个自主服务平台来支持这样的用例,以及 Uber 不同部门的许多其他用例。该平台的核心构件是 Apache Pinot,这是一个分布式的在线分析处理(OnLine Analytical Processing,OLAP)系统,该系统用于对 TB 级数据执行低延迟的分析查询。在本文中,我们介绍了这一平台的细节,以及它如何融入 Uber 的生态系统。我们重点介绍了 Pinot 在 Uber 内部的演变,以及我们如何从少数用例扩展到多集群,全主动部署,为数百个用例提供支持,以毫秒级的延迟查询 TB 级规模的数据。
用例概述
Apache|Uber 大规模运行 Apache Pinot实践
文章插图
上图描述了实时分析用例的典型需求。Uber 内部的不同用例可以分为以下几个大类:
仪表板
Uber 的许多工程团队使用 Ponot 为各自的产品构建定制的仪表板。 Uber Eats Restaurant Manager (餐厅经理)就是其中的一个例子:
Apache|Uber 大规模运行 Apache Pinot实践
文章插图
这个仪表板可以让餐厅老板从 Uber Eats 订单中获得有关客户满意度、热门菜单、销售和服务质量分析的信息。Pinot 支持以不同的方式对原始数据进行切片和分片,并支持低延迟查询,从而为餐厅老板带来丰富的体验。
类似地,我们的城市运营团队已经构建了定制的仪表板,利用 Pinot 的实时和历史数据相结合的能力,获取供需、异常事件(例如,最近五分钟内延迟的订单)、实时订单等方面的指标。这是我们日常运营的重要工具,有助于及早发现问题。
分析应用程序
另一类用例源于作为许多后端服务的一部分执行分析查询的需求。这类用例的主要区别要求是数据的新鲜度和查询延迟,他们本质上需要是实时性的。例如,实时识别 Uber 乘客分组的地理热点对于良好的用户体验至关重要。同样,立即识别出司机取消或遗弃的 Uber Eats 购物车,可以快速采取纠正措施(以消息 / 奖励的形式)。
近实时探索
数据探索通常是在传统的批处理和仓库系统(如 Hadoop)上完成的。但是,有许多情况下,用户需要能够对实时数据执行复杂的 SQL 查询。例如,工程师经常需要通过加入微服务记录的各种事件来对事件进行分流。在其他情况下,实时时间可能需要与 Hive 中的批数据集连接。在 Uber 内部,我们在 Apache Pinot 之上提供了一个丰富的(Presto)SQL 接口,以开启对底层实时数据集上的探索。此外,该接口与我们所有的内部商业智能工具(如 Dashbuilder)无缝对接,这对我们所有的客户都非常有用。例如,下面是一张简单的 Sunburst 图表,显示了 Uber Eats 在五分钟内的订单明细,针对特定地区按工作状态分组。这是使用 Dashbuilder 通过在 Pinot 之上运行 Presto 查询在几秒钟之内构建的。
Apache|Uber 大规模运行 Apache Pinot实践
文章插图
今天,生产中数百个关键业务用例由 Apache Pinot 提供支持。在过去的几年里,我们已经从一个 10 节点的小型集群发展到每个区域数百个节点。由 Pinot 管理的总数据占用空间已经从早期的几十 GB 增长到今天的几十 TB。同样地,每个区域的每秒查询量也增加了 30 倍(今天生产中的每秒查询量高达数千次)。
在下面的章节中,我们将详细介绍我们的平台,讨论 Uber 对 Apache Pinot 做出的独特贡献,并详细阐述在大规模运营该平台的过程中所学到的经验教训。
Uber 的 Pinot 平台
为了服务这样的用例,我们围绕 Apache Pinot 构建了一个自助服务平台,如下图所示:
Apache|Uber 大规模运行 Apache Pinot实践