Spark: Shuffle & 数据倾斜(个人总结)

本文探讨了Spark中的Shuffle操作,包括HashShuffle、优化后的HashShuffle、SortShuffle及其优化版bypassSortShuffle的原理与优缺点。重点讲述了数据倾斜问题,分析了在分组聚合和Join操作中可能出现的数据倾斜,并提出了预聚合、两阶段聚合、调整并行度等解决方法。同时,介绍了如何通过样本取样和排名识别热点key。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    声明: 1. 本文为我的个人复习总结, 并那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
              2. 由于是个人总结, 所以用最精简的话语来写文章
              3. 若有错误不当之处, 请指出

四种Shuffle:

  1. HashShuffle: 产生的磁盘小文件的个数为 maptask*reducetask 个

    缺点: 临时小文件太多,I/O读取压力 和 磁盘存储压力大

  2. 优化后的HashShuffle: 多个Task共用一个临时文件, 产生的磁盘小文件的个数为 cpu*reducetask 个

  3. SortShuffle(新出来的): 先排序再Shuffle 然后再Merge多个临时小文件(一个文件内有多个分区)为1个临时文件+1个索引文件

    缺点: 排序太伤性能

  4. bypassSortShuffle(优化后的SortShuffle): Task数量小于spark.shuffle .sort.bypassMerge Threadshold参数的值(默认为200)时, 不进行排序, 按照分区溢写文件

数据倾斜:

发现热点key的方法: sample取样+rank前几名

分类:

  1. 分组聚合时 可能会有数据倾斜

    解决办法:

    1. 从源头数据上进行预聚合

      预聚合成一个中间表, 后续处理都复用这个中间表

    2. 两阶段聚合:

      第一阶段拼接随机数后缀 然后局部聚合, 第二阶段去掉随机数后缀 然后全局聚合

  2. Join时 可能会有数据倾斜

    解决办法:

    分类:

    1. 小表 join 大表

      使用MapJoin: 缓存小表然后进行广播, 在各个Task再进行join

    2. 大表 join 大表:

      将A表的含有热点key的数据, 拼接[1~n]内的随机数后缀,

      然后B表扩容n倍, 确保无论在哪个分区中 A表都能看到全部的B表数据 并与之进行join

通用解决方案 但又治标不治本: 提高 shuffle 操作的并行度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值