数据倾斜解决方案
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扩容相应的个数)(只能缓解,不能根本消除,会造成数据量急剧增大)