1. 分布式聚合(部分聚合+最终聚合)的两阶段下推
分布式聚合(部分聚合+最终聚合)的两阶段下推是如何实现的?
- 部分聚合(partial)与最终聚合(final)两阶段
- 聚合下推到各节点
- 可分解聚合与不可分解聚合
分布式聚合采用两阶段:第一阶段(partial aggregation)在各节点本地对本地数据做部分聚合,大幅减少上传到上游的数据量;第二阶段(final aggregation)在汇总节点(或协调器)对收到的部分结果做最终聚合。聚合下推的关键是"聚合函数可分性":可分解的聚合(如 COUNT、SUM、AVG、MIN、MAX)可以先在本地算部分值再合并,AVG 可分解为 SUM/COUNT 组合;不可分解或需要全局信息的聚合(如 COUNT DISTINCT、取中位数、任意一个值)无法简单两阶段合并,需要保留每组的完整集合或使用特殊结构(如 HyperLogLog 做近似去重)。两阶段聚合能显著减少网络传输,是分布式聚合性能的核心。
两阶段聚合的本质是"本地先算、再汇总",利用可分解函数把计算下推到数据所在节点,减少 Exchange 数据量。对不可分解聚合,需保留中间状态或接受近似。这决定了分布式聚合是否高效。
-- 可分解聚合:COUNT/SUM 可拆分两阶段
SELECT region, COUNT(*), SUM(amount)
FROM orders
GROUP BY region;
-- 引擎自动转化为:先本地 GROUP BY + 部分聚合,再向上汇总