优步的Pinot查询改革:简化层和提高可观测性
来源: InfoQ - 后端
优步重新设计了其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"