数据倾斜的方案里,使用随机 key搞双重聚合算是个比较实用的套路。你在用Spark或者Hadoop MapReduce跑分布式任务时,总会遇到某个 key 大,搞得部分节点忙得要命,其他节点闲得发慌。嗯,这就挺影响性能的。

随机 key 的玩法比较简单。先给每条记录加一个随机 hash 值,生成新 key。第一轮聚合就按这个新 key 来分组,让数据分散到不同节点。这样算下来,负载就均匀多了,响应也快。

不过啊,第一步聚合会把原来的 key 丢掉。怎么办?第二轮再来一次,把原始 key拿回来,进行最终聚合。你可以用reduceByKeycombineByKey去做,代码也比较清晰。比如用mapPartitions加随机 key,再reduceByKey就挺顺的。

要注意哦,这么搞会多一次网络传输,数据量大的话,通信开销不小。建议先评估数据规模,再决定是不是要用这个策略。反正实在不行,配合分区数调整或者预也行。

如果你在Spark 分布式计算,可以看看这篇文章,思路还挺全:Spark 分布式计算框架