spark数据倾斜解决方案

数据倾斜解决方案之原理以及现象分析

image

数据倾斜解决方案之聚合源数据以及过滤导致倾斜的key

image

084.用户访问session分析-数据倾斜解决方案之提高shuffle操作reduce并行度

image

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

image

数据倾斜解决方案之将reduce join转换为map join

image

数据倾斜解决方案之sample采样倾斜key单独进行join

image

数据倾斜解决方案之使用随机数以及扩容表进行join

image

1
2
Rdd2 (比如n=10),就扩成1_1,3/2_1,3/3_1,3/…/9_1,3/10_1,3; 1_2,1/2_2,1/3_2,1/…/9_2,1/10_2,1;(共20个)
RDD1(比如n=10),就随机阔成2_1,1/3_1,2(2个)

spark SQL 数据倾斜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1、聚合源数据
2、过滤导致倾斜的key
3、提高shuffle并行度:spark.sql.shuffle.partitions
4、双重group by
5、reduce join转换为map join:spark.sql.autoBroadcastJoinThreshold
6、采样倾斜key并单独进行join
7、随机key与扩容表
由于Spark的这种都是基于RDD的特性;哪怕是Spark SQL,原本你是用纯的SQL来实现的;各位想一想,其实你用纯RDD,也能够实现一模一样的功能。
之前使用在Spark Core中的数据倾斜解决方案,全部都可以直接套用在Spark SQL上。(它意思是不用spark sql 这种一条SQL 就能解决业务逻辑的方法 反而 用写代码的方式 比如 group by 明明可以 放在 SQL 语句中 但这里他要 用 spark core 里面的 rdd 的groupByKey算子 实现业务需求 那样 自然就能用之前讲的 spark core的数据倾斜解决方案 解决数据倾斜了)
我们要讲一下,之前讲解的方案,如果是用纯的Spark SQL来实现,应该如何来实现。
1、聚合源数据:Spark Core和Spark SQL没有任何的区别
2、过滤导致倾斜的key:在sql中用where条件
3、提高shuffle并行度:groupByKey(1000),spark.sql.shuffle.partitions(默认是200)
4、双重group by:改写SQL,两次group by(cht注:给某一个字段对应数据的值加上随机前缀(用sparkSQL的自定义函数实现))
5、reduce join转换为map join:spark.sql.autoBroadcastJoinThreshold(默认是10485760 )
你可以自己将表做成RDD,自己手动去实现map join
Spark SQL内置的map join,默认是如果有一个小表,是在10M以内,默认就会将该表进行broadcast,然后执行map join;调节这个阈值,比如调节到20M、50M、甚至1G。20 971 520
6、采样倾斜key并单独进行join:纯Spark Core的一种方式,sample、filter等算子(不是特别适用于spark SQL,如果要用这个 就得把业务逻辑用spark core 去实现)
7、随机key与扩容表:Spark SQL+Spark Core