Spark 数据倾斜问题 — 通俗易懂

        原因:数据本身不均,分组之后导致不均匀或者filter过后分区间数据量不一致,造成某些key的value数据量远大于其他key的,导致绝大多数的任务执行的很快,只有少部分的任务执行的很慢甚至执行失败

一、如果是filter过后导致的数据倾斜

        直接使用coalesce算子重分区即可

 

二、复杂一点的数据倾斜

1)避免shuffle

        在spark任务执行前,比如使用sql将具有相同key的值用特殊的字符串进行拼接,这样每个key只有一个value,从而避免了shuffle

2)过滤可能导致倾斜的key

        如果允许丢弃某系数据,可以考虑将可能导致数据倾斜的key给过滤掉

3)将reduce join转为map join

        这种适用于RDD比较小,可以将这个小的RDD采集到Driver端,为其全量数据创建一个广播变量,广播这个RDD。然后另外一个RDD使用map等算子进行实现

4)加盐减盐

        给数据倾斜严重的key进行加盐,打上一个随机数,然后按照这个key进行局部聚合。接着减盐,去掉这个key的随机数,进行最终的聚合

 

ps:spark3.0版本引入的优化框架,默认是开启的,主要由三点作用

1. 动态合并shuffle分区

        在shuffle过后,Reduce Task的数据分布不均匀,AQE会自动的合并过小的数据分区

2. 调整join策略

        当参加join表的数据量小于广播大小的阈值时,会将其调整为Broadcast Hash join

3. 自动优化数据倾斜 -> 膨胀系数、最低阈值、拆分粒度

        会自动拆分Reduce阶段过大的数据分区

ps:Boradcast Hash join

假设你有两张表:表A和表B。表A非常大,包含数百万条记录,而表B比较小,只有几千条记录。如果使用普通的Shuffle Hash Join,那么Spark需要将这两张表都进行分区,然后通过网络将数据进行Shuffle,最后再进行哈希连接。这种操作在处理大数据时会非常耗费资源,特别是网络带宽和磁盘I/O。

而如果使用Broadcast Hash Join,Spark会将表B(小表)广播到每一个执行节点。这样,每个节点可以直接在本地内存中完成表A(大表)和表B的哈希连接操作,无需通过网络进行数据交换。这样大大减少了Shuffle的开销,提升了查询的效率。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值