Spark SQL数据倾斜解决方案

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,也能够实现一模一样的功能。
比如我们之前的GROUP BY area, product_id,我们是不是可以把这两个东西做成一个组合key,然后
RDD应用groupByKey算子操作啊!然后我们可以再对每个分组后的数据统计一下数量,click_count
对分组后的数据进行自己写代码方式去重然后再组合拼接在一起!city_infos
之前使用在Spark Core中的数据倾斜解决方案,全部都可以直接套用在Spark SQL上。

我们要讲一下,之前讲解的方案,如果是用纯的Spark SQL来实现,应该如何来实现。

1、聚合源数据:Spark Core和Spark SQL没有任何的区别
2、过滤导致倾斜的key:在sql中用where条件
3、提高shuffle并行度:groupByKey(1000),spark.sql.shuffle.partitions(默认是200)
sqlContext.setConf(“spark.sql.shuffle.partitions”, “1000”);
4、双重group by:改写SQL,两次group by
295行
双重group by
这样就要给某个字段加上随机前缀,我们定义函数UDF,random_prefix()
public class RandomPrefixUDF implements UDF2<String, Integer, String> {
注册自定义函数
sqlContext.udf().register(“random_prefix”,
new RandomPrefixUDF(), DataTypes.StringType);
sqlContext.udf().register(“remove_random_prefix”,
new RemoveRandomPrefixUDF(), DataTypes.StringType);
然后就可以改写SQL,两次group by
5、reduce join转换为map join:spark.sql.autoBroadcastJoinThreshold(默认是10485760 )
可以选择,你可以自己将表做成RDD,自己手动去实现map join
也可以选择,Spark SQL内置的map join,默认是如果有一个小表,是在10M以内,
默认就会将该表进行broadcast,然后执行map join;调节这个阈值,比如调节到20M、50M、甚至1G。
sqlContext.setConf(“spark.sql.autoBroadcastJoinThreshold”, “20971520”);
也就是SQL里面有JOIN,它内部会给你进行优化,如果两张表都很大,那就还是会有shuffle
6、采样倾斜key并单独进行join:
如果碰到这种,就等于把spark SQL转成纯Spark Core的一种方式,sample、filter等算子
7、随机key与扩容表:Spark SQL+Spark Core
比如364行,对product_info表进行扩容10倍,每条记录都有一0到10的前缀!
然后之前的那张tmp_area_product_click_count表里面的product_id也应用上随机前缀为了后面JOIN!

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值