适用场景
如果在进行join操作时,RDD中有大量的Key导致数据倾斜,那么进行分拆key也没什么意义,此时就只能使用最后一种解决方案来处理了。
实现思路
该方案的实现思路基本和上一个相似,首先查看RDD/Hive表中的数据分布情况,找到那个造成数据倾斜的RDD/Hive表,比如有多个key都对应了超过1万条数据,然后将该RDD的每条数据都打上一个N以内的随机前缀,
同时对另外一个正常的RDD进行扩容,经每条数据都扩容成N条数据,扩容出来的每条数据都依次打上一个0~N的前缀,最后将两个处理后的RDD进行join即可。
实现原理
将原先一样的key通过附加随机前缀变成不一样的key,然后就可以将这些处理后的“不同key”分散到多个task中去处理,而不是让一个task处理大量的相同key。
该方案与上一个方案的不同之处就在于,上一个方案是尽量只对少数倾斜key对应的数据进行特殊处理,由于处理过程需要扩容RDD,因此上一种方案扩容RDD后对内存的占用并不大;
而这一种方案是针对有大量倾斜key的情况,没法将部分key拆分出来进行单独处理,因此只能对整个RDD进行数据扩容,对内存资源要求很高。
优点
对join类型的数据倾斜基本都可以处理,而且效果也相对比较显著,性能提升效果非常不错。
缺点
该方案更多的是缓解数据倾斜,而不是彻底避免数据倾斜。而且需要对整个RDD进行扩容,对内存资源要求很高。