数据倾斜解决方案之三:使用随机Key实现双重聚合

来源:互联网 发布:js判断ie版本是否大于7 编辑:程序博客网 时间:2024/05/18 18:54

数据倾斜解决方案之三:使用随机Key实现双重聚合


本节讲解使用随机Key实现双重聚合,首先讲解什么是随机Key双重聚合;接下来讲解使用随机Key实现双重聚合解决数据倾斜的适用场景、原理分析、案例实战以及使用随机Key实现双重聚合解决数据倾斜注意事项等内容。

30.4.1 什么是随机Key双重聚合?

随机Key双重聚合是指:Spark分布式计算对RDD调用reduceByKey各算子进行计算,使用对Key值随机数前缀的处理技巧,对Key值进行二次聚合:

1、   第一次聚合(局部聚合):对每一个Key值加上一个随机数,执行第一次reduceByKey聚合操作。

2、   第二次聚合(双重聚合):去掉Key值的前缀随机数,执行第二次reduceByKey聚合,最终得到全局聚合的结果。

30.4.2使用随机Key实现双重聚合解决数据倾斜的适用场景分析

适用于groupByKey、reduceByKey等算子操作数据时某些Key值发生数据倾斜的情况。例如电商广告点击系统中,如果根据用户点击的省份进行汇聚,原来的Key值是省份,如果某些省份的Value值特别多,发生了数据倾斜,可以将每个Key拆分为成多个Key,加上随机数前缀将Key值打散,组拼成random_省份的新的Key值,调用reduceByKey

做局部聚合,然后再将random_前缀去掉,形成的Key值仍为省份,再调用reduceByKey,进行全局聚合。

30.4.3使用随机Key实现双重聚合解决数据倾斜原理分析

使用随机Key实现双重聚合解决数据倾斜原理分析:例如reduceByKey

假设说有倾斜的Key,我们给所有的Key加上一个随机数,然后进行reduceByKey操作;此时同一个Key会有不同的随机数前缀,在进行reduceByKey操作的使用原来的一个非常大的倾斜的Key就分而治之变成若干个更小的Key,不过此时结果和原来不一样,怎么破?进行map操作,map操作的目的是把随机数前缀去掉,然后再次进行reduceByKey操作,(当然,可以再次做随机数前缀),这样我们就可以把原本倾斜的Key通过分而治之方案分散开来,最后又进行了全局聚合。在这里的本质还是通过改变并行度去解决数据倾斜的问题。  

30.4.4使用随机Key实现双重聚合解决数据倾斜案例实战

使用随机Key实现双重聚合解决数据倾斜案例实战:我们看一个reduceByKey(_+_)的示例。假设RDD不同Partition的数据内容分别为 (1,1)(1,2)(1,3)以及(2,1)(1,2)(1,3),我们通过map操作加上随机数,将数据转换为(1_1,1)(2_1,2)(3_1,3)以及(1_2,1)(2_1,2)(3_1,3);然后我们进行reduceByKey的累加操作,汇聚的结果为(1_1,1)(2_1,4)以及(3_1,6)(1_2,1),然后通过map转换去掉随机数前缀,转换为(1,1)(1,4)以及(1,6)(2,1)再进行一次reduceByKey操作,转换成(1,11)以及(2,1)。最终将结果输出到Output file1、Output file2。如图 30- 5所示。


 

图 30- 2 reduceByKey操作示意图

 

30.4.5使用随机Key实现双重聚合解决数据倾斜注意事项

        使用随机Key实现双重聚合解决数据倾斜方案局限于单个RDD的reduceByKey、groupByKey等算子。如果两个RDD的数据量都特别大而且倾斜的Key特别多就无法采用分而治之进行双重聚合的方法,我们需综合应用各种数据倾斜的解决方案,例如通过扩容来进行Join操作解决数据倾斜问题。

 


阅读全文
0 0
原创粉丝点击