第139课: Spark面试经典系列之数据倾斜解决之对于两个RDD数据量都很大且倾斜的Key特别多如何解决?
2017-07-10 21:22
831 查看
第139课: Spark面试经典系列之数据倾斜解决之对于两个RDD数据量都很大且倾斜的Key特别多如何解决?
如果两个RDD的数据量都特别大而且倾斜的Key特别多如何解决:数据量特别大就无法把其中的一个RDD广播出去;如果倾斜的Key值特别多,就无法采用分而治之等方法。例如微信上有海量的数据、淘宝上有海量的数据,如果进行全网扫描就可能遇到这种情况,因为热点特别多,有成千上万个热点。
两个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时间。
我们写一个模拟代码如下:
1. RDD1 join RDD2
2.
3. rdd2 2= RDD2.flatMap {
4. for(1 to 10) {
5. 1_item
6. }
7. }
8.
9. rdd11 = RDD1.map{
10. Random(10)
11.
12. random_item
13.
14. }
15.
16. result = rdd11.join(rdd22)
17.
18. result.map{
19. item_1.split 去掉前缀
20.
21. }
RDD1和RDD2进行join操作,我们对RDD2进行flatMap操作,由于n越大就越容易造成OOM,假设n等于1000,分配到不同的Task中,数据规模变大,就容易OOM。这里假设n等于10,循环遍历n,对item加上前缀i;然后对RDD1进行map操作,加上10以内的随机数前缀。最后,将rdd11和rdd22进行Join,然后对result进行map操作去掉前缀,得到最后结果。
如果两个RDD的数据量都特别大而且倾斜的Key特别多如何解决:数据量特别大就无法把其中的一个RDD广播出去;如果倾斜的Key值特别多,就无法采用分而治之等方法。例如微信上有海量的数据、淘宝上有海量的数据,如果进行全网扫描就可能遇到这种情况,因为热点特别多,有成千上万个热点。
两个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时间。
我们写一个模拟代码如下:
1. RDD1 join RDD2
2.
3. rdd2 2= RDD2.flatMap {
4. for(1 to 10) {
5. 1_item
6. }
7. }
8.
9. rdd11 = RDD1.map{
10. Random(10)
11.
12. random_item
13.
14. }
15.
16. result = rdd11.join(rdd22)
17.
18. result.map{
19. item_1.split 去掉前缀
20.
21. }
RDD1和RDD2进行join操作,我们对RDD2进行flatMap操作,由于n越大就越容易造成OOM,假设n等于1000,分配到不同的Task中,数据规模变大,就容易OOM。这里假设n等于10,循环遍历n,对item加上前缀i;然后对RDD1进行map操作,加上10以内的随机数前缀。最后,将rdd11和rdd22进行Join,然后对result进行map操作去掉前缀,得到最后结果。
相关文章推荐
- 第139课: Spark面试经典系列之数据倾斜解决之对于两个RDD数据量都很大且倾斜的Key特别多如何解决?
- 第137课: Spark面试经典系列之数据倾斜解决之Map 端Reduce及问题思考
- 第138课: Spark面试经典系列之数据倾斜解决之采样分而治之解决方案
- 136课: Spark面试经典系列之数据倾斜解决原理和方法总论.
- 第140课: Spark面试经典系列之数据倾斜解决之并行度的深度使用
- 第143课:Spark面试经典系列之Reduce端OOM和shuffle file not found如何解决
- 第143课: Spark面试经典系列之Reduce端OOM和shuffle file not found如何解决?
- 第135课: Spark面试经典系列之数据倾斜:数据倾斜是多么痛?!
- Spark面试经典系列之数据倾斜: 数据倾斜之痛
- Spark面试经典系列之数据倾斜解决方案的“银弹”是什么? 本节我们对Spark数据倾斜解决方案进行回顾和总结
- 第135-141课:Spark面试经典系列之数据倾斜
- spark 通过打散热点key解决数据倾斜问题
- 解决spark中遇到的数据倾斜问题
- Spark RDD/Core 编程 API入门系列 之rdd案例(map、filter、flatMap、groupByKey、reduceByKey、join、cogroupy等)(四)
- Spark系列之数据倾斜:数据倾斜之痛
- Spark系列之数据倾斜:数据倾斜之痛
- 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink--容错机制(ACK,RDD,基于log和状态快照),消息处理at least once,exactly once两个是关键
- Spark RDD/Core 编程 API入门系列之map、filter、textFile、cache、对Job输出结果进行升和降序、union、groupByKey、join、reduce、lookup(一)
- 解决spark中遇到的数据倾斜问题
- 网站访问量和数据量需要都很大,如何解决?