Spark数据倾斜解决方案六:随机前缀和扩容Join

如何扩容

两个RDD数据都特别多且倾斜的Key有成千上万个,该如何解决数据倾斜的问题?初步的想法:在倾斜的Key上加上随机数。该想法的原因:Shuffle的时候把Key的数据可以分到不同的Task里。加随机数有一个前提:必须知道哪些是倾斜的Key。但是,现在的倾斜的Key非常多,成千上万,所以如果说采样找出倾斜的Key的话,并不是一个非常好的想法。
下一个想法是考虑进行扩容:首先,什么是扩容?扩容就是把该RDD中的每条数据变成5条、10条、20条等。例如,RDD中原来是10亿条数据,扩容后可能变成1000亿条数据。
其次,如何扩容?flatMap中对要进行扩容的每条数据都通过0~N−1个不同的前缀变成N条数据。
问题:N的值可以随便取吗?需要考虑当前程序能够使用的Core的数目。
答案:N的数字一般不能取得特别大,通常都会小于50,否则对磁盘、内存和网络都会形成极大的负担,如会造成OOM。
接下来:
(1)将另外一个RDD的每条数据都打上一个n以内的随机前缀。
(2)最后将两个处理后的RDD进行Join即可。 N这个数字取成10和取成1000除了OOM等不同外,是否还有其他影响呢?
其实,N的数字的大小还会对数据倾斜的解决程度构成直接影响!N越大,越不容易倾斜,但是也会占用更多的内存、磁盘、网络以及消耗更多的CPU时间。

适用场景

如果在进行join操作时,RDD中有大量的key导致数据倾斜,那么进行分拆key也没什么意义

你可能感兴趣的:(Spark最佳实战与性能优化,spark,数据倾斜,随机前缀,扩容,join)