????声明: 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.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |