两阶段聚合(Two-Stage Aggregation),通常被称为“加盐局部聚合 + 去盐全局聚合”,是大数据处理(如 Spark、MapReduce)中解决聚合类数据倾斜(Aggregation Data Skew)最有效、最通用的方案之一。 简单来说,它的核心思想是:将原本要汇聚到一个节点处理的“超级大Key”,先拆分成多份分散到不同节点做预处理,最后再合并结果。 --- 1. 为什么会有数据倾斜?(背景) 在 Spark 中执行 、 或 SQL 的 时,Spark 会根据 Key 的 Hash 值进行 Shuffle(洗牌),将相同的 Key 拉取到同一个 Task(分区)中进行处理。 正常情况:Key 分布均匀,每个 Task 处理的数据量差不多。 倾斜情况:某个 Key(例如 "北京" 或 "Null")的数据量特别大(比如有 1000 万条),而其他 Key 只有几百条。 结果:处理 "北京" 的那个 Task 会非常慢,甚至因为内存溢出(OOM)而崩溃,导致整个作业卡死。 2. 什么是两阶段聚合? 为了解决上述问题,我们将一次大的聚合操作拆分为两个阶段: 1. 第...