数据倾斜解决方案

1)聚合原数据(主要操作的是hive数据库中的数据,先通过hive  sql将相同key的数据聚合成一条数据,再进行map操作)

当没办法聚合成一条数据时:增大key粒度,从而key的数量会减少,但是每个key对应的数据量会增大,key之间的数据量差异可能会减少。

 

 

2)过滤导致倾斜的key

3)提高shuffle操作中的reduce并行度(reduceBykey(200)传入并行度参数)

对于sparkSql中的shuffle类语句,比如group by ,join等需要设置一个参数,即spark.sql.shuffle.partitions,该参数代表了shuffle read task的并行度,默认是200,增加shuffle read task 的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原先更少的数据(缺点:只能缓解,并不能从根本上消除)

4)使用随机数key实现双重聚合(添加随机数,将相同key打散聚合,去掉随机数再聚合一次)

5)reduce join转换成map join(适合两个rdd数据量相差比较大的,将小数据量的rdd广播出去,将小rdd collect到driver端,广播出去)

6)sample采样对倾斜key单独进行join(适用于只有一个key的,将其单独进行join,另一部分进行Join,最后union合并)

【注:在spark中,如果某个rdd只有一个key,那么在shuffle过程中会默认将此key对应的数据打散,由不同的reduce端task进行处理】

7)适用随机数以及扩容进行join(多个倾斜的key,一个rdd添加随机数,另一个rdd扩容相应的个数)(只能缓解,不能根本消除,会造成数据量急剧增大)

posted @ 2020-04-16 16:25  hulifang  阅读(566)  评论(0编辑  收藏  举报