????声明: 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 操作的并行度
|