irpas技术客

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

网络 7388

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

四种Shuffle:

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

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

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

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

缺点: 排序太伤性能

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

数据倾斜:

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

分类:

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

解决办法:

从源头数据上进行预聚合

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

两阶段聚合:

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

Join时 可能会有数据倾斜

解决办法:

分类:

小表 join 大表

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

大表 join 大表:

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

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

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


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #spark #shuffle #amp #数据倾斜个人总结 #1 #本文为我的个人复习总结