中间件速查手册
大数据计算洗牌

Shuffle 是什么?

把数据按 key 重新分发到不同节点,是 Spark 里最贵的一步

类比:把一摞扑克按花色重新分给四个人

为什么必须 shuffle

group by、join、distinct、repartition 都要求“相同 key 的数据在同一台机器上”。原始数据是按文件块分布的,同一个用户的数据可能散在所有节点,所以必须先按 key 重新分发。

贵在哪

写端要把数据按目标分区写到本地磁盘(可能还有排序),读端要跨网络拉取、反序列化、合并。磁盘 IO + 网络传输 + 序列化,三样都占满了。一个作业 80% 的时间经常花在 shuffle 上。

怎么减少 shuffle

能 broadcast 的小表就别 join(BroadcastHashJoin 不发 shuffle);能先聚合再 join 就先 reduce 数据量;分区数要匹配数据量,200 个分区处理 10GB 数据意味着每个分区 50MB,偏大。

它出现在这些中间件里

相关概念