Spark数据倾斜解决方法

1、避免shuffle,改reduce join为map join,适用于JOIN的时候有一个表是小表的情况,直接使用collect()获取小表的所有数据,然后brodcast,对大表进行MAP,MAP时直接提取broadcast的小表数据实现JOIN;

2、随机数的方案,对于聚合类操作,可以分步骤进行聚合,第一步,在原来的KEY后面加上随机数(比如1~10),然后进行聚合(比如SUM操作);第二步去掉KEY后面的随机数;第三部再次聚合(对应第一步的SUM),只适用于聚合类场景;

3、HIVE预处理的方案,如果已经有数据倾斜,则用HIVE预处理,然后将结果加载到SPARK中进行使用,适用于SPARK会频繁使用但是HIVE只会预计算一次的场景,用于即席查询比较多;

4、修改或者提升shuffle的并行度,使用repatition进行,比如原来每个节点处理10个KEY的数据,现在处理3个KEY的数据,虽然某些KEY仍然是热点,但是会缓解不少;

5、过滤掉发生倾斜的KEY,场景较少,可以用采样、预计算的方式计算出KEY的数量分布,然后过滤掉最多的KEY的数据即可;

6、分治法+空间浪费法,将A表中热点KEY的数据单独提取出来,对KEY加上随机前缀;然后将B表对应热点KEY的数据提取出来,重复加上所有的随机数KEY,然后这俩RDD关联,得到热点的结果RDD;对于A/B剩下的数据,按普通的进行JOIN,得到普通结果的RDD;然后将热点RDD和普通RDD进行UNION得到最终结果;

7、完全空间浪费法,对A表所有数据的KEY加随机前缀,对B表所有KEY做重复加上所有的随机前缀,然后做关联得到结果;

8、多种方法配合使用;

本文总结自:https://www.iteblog.com/archives/1671.html

本文地址:http://www.crazyant.net/2231.html

发表评论

电子邮件地址不会被公开。