
优步重新设计了其Apache Pinot查询架构,以简化执行,支持更丰富的 SQL,并提高内部分析工作负载的可预测性。之前的 Neutrino 系统叠加了 Presto 和 Pinot,已被一个名为 Cellar 的轻量级代理所取代,并使用了 Pinot 的多阶段引擎轻量模式(Multi-Stage Engine Lite Mode)。新设计的目标是降低复杂性,强制执行限制,并为多租户提供更强的隔离。
以前,Neutrino作为一个无状态的微服务运行,结合了 Presto 协调器和工作进程。用户提交的 PrestoSQL 查询部分被推送到 Pinot 作为PinotSQL,而剩余的查询逻辑在 Neutrino 内执行。每个查询都包括默认的或用户定义的限制,以减少全表扫描的风险。尽管有这些保护措施,分层架构创造了复杂的语义,使得查询计划更难于解释,并且限制了共享相同代理的租户之间的隔离。
优步的 Neutrino 查询架构(图片来源:优步的博客文章)
优步的 Apache Pinot 表可以达到数百 TB,拥有数十亿条记录,处理从个位数到数千 QPS 的查询率。在这个规模上的多阶段查询很容易超出资源或延迟预期。Pinot 1.4 引入了多阶段引擎轻量模式(Multi-Stage Engine Lite Mode),它强制执行可配置的叶子阶段的记录限制,并使用散射-收集(scatter-gather)模式。叶子阶段在 Pinot 服务器上运行,而其他操作符在代理上执行,确保复杂查询的可预测性能。
新架构引入了 Cellar,这是一个轻量级代理,它直接将查询转发到 Pinot 代理。对于基本工作负载,Pinot 的单阶段查询引擎负责处理执行,而对于高级 SQL 功能,优步使用多阶段引擎的轻量模式。MSE 轻量模式在叶子阶段确保可配置的最大记录限制,以防止过度使用资源,并在解释计划中显示这些限制以提高透明度。散射-收集执行仍然存在,叶子阶段在数据节点上,并在代理上聚合,同时在受控条件下支持连接和窗口函数。优步还为 MSE 轻量模式增加了监控和日志增强功能,使工程团队能够更有效地跟踪查询性能和排除高延迟请求。
高层的 Cellar 查询架构(图片来源:优步的博客)
Cellar 还包括一个直接连接模式,允许租户绕过代理直接连接到 Pinot 代理。优步还集成了一个时序插件,它通过 Cellar 支持M3QL。重建的架构支持内部分析工作负载,如跟踪、日志搜索和细分。截至发布时,Cellar 处理了 Neutrino 之前查询量的大约 20%,计划扩大采用并逐步淘汰 Neutrino。
实现完整隔离的 Cellar 直连模式(图片来源:优步的博客)
优步还为 Java 和 Go monorepos 提供了官方客户端库,以简化与 Cellar 的交互。客户端处理 Pinot 的响应格式,支持带有警告的部分结果,强制超时和重试,并发出延迟、查询成功和警告的指标。Grafana 仪表板为新用户提供了开箱即用的操作可见性。
根据优步的工程团队的说法,重新设计反映了 OLAP 系统的发展,以支持高 QPS 和亚秒级延迟,同时保持隔离和可预测性。他们计划在今年晚些时候向用户发布 MSE 轻量模式,并进一步改进它。
查看英文原文:Inside Uber’s Pinot Query Overhaul: Simplifying Layers and Improving Observability








评论