spark 的group by ,join数据倾斜调优

背景

spark任务中最常见的耗时原因就是数据分布不均匀,从而导致有些task运行时间很长,长尾效应导致的整个job运行耗时很长

数据倾斜调优

首先我们要定位数据倾斜,我们可以通过在spark ui界面中查看某个stage下的task的耗时,如果发现某些task耗时很长,对应要处理的数据很多,证明有数据倾斜的问题,那么我们怎么处理数据倾斜呢,

1.增加shuffle操作的并行度,也就是设置spark.sql.shuffle.partitions的值,这个参数可以提高shuffle read task的并行度,也就是处理当某个stage下面task数量很少的问题,通过提供并行度,提高性能--备注:这里顺带说下shuffle write task,shuffle write task是shuffle read task的前一个阶段的任务,一般来说其是否均匀是由shuffle read task任务的数量决定的

2.对于两个大表的join时,如果某个大表数据不均匀,那么可以对这个大表的数值都增加一个0-n的随机数,另外一个大表膨胀n倍,每个数值M都膨胀为M-0,M-1...M-n,然后在对两个表进行join操作,这种情况下虽然其中的一个大表数据膨胀了n倍,但是这点性能消耗是值得的,因为这样操作后join的操作就会非常快了

3.对于group by聚合,可以采用两阶段聚合的方式,先进行局部聚合再进行全局聚合的方式进行,局部聚合方式是先对表的数值都增加一个随机数0-n,然后group by聚合,得到一个聚合的中间结果,然后再次对这个中间结果去掉随机数前缀后进行group by聚合,得到一个全局的聚合结果

4.对于大表和小表的join时,我们可以对小表进行broadcast操作,把小表进行广播,这样driver和executor的内存中都会有一份小表的rdd数据,这样executor进行join操作时使用来自小表的基于内存的操作就会非常快--备注:driver内存中也有一份小表的数据是因为driver要把这份小表的数据收集到自己的本地内存中,然后再分发到各个executor的内存中,所以broadcast广播的情况下,记得要同时增加driver和executor的内存

参考文献:https://zhuanlan.zhihu.com/p/22024169

相关推荐
kicikng1 小时前
智能体来了(西南总部)完整拆解:AI Agent 指挥官 + AI调度官架构图
大数据·人工智能·多智能体系统·ai agent指挥官·ai调度官
老友@1 小时前
分布式事务完全演进链:从单体事务到 TCC 、Saga 与最终一致性
分布式·后端·系统架构·事务·数据一致性
liliangcsdn1 小时前
RL中GAE的计算过程详解
大数据·人工智能·算法
shjita2 小时前
mapreduce多文件的处理手法
大数据·mapreduce
AdMergeX2 小时前
前沿观察 | “死了么”爆火背后:洞察年轻人情绪刚需,重构应用增长新逻辑
大数据·广告saas·流量变现
雨大王5123 小时前
国内外工业AI原生企业对比分析与实战案例解读
大数据
开源能源管理系统3 小时前
MyEMS开源能源管理系统:赋能石膏制品制造业绿色低碳转型与降本增效
大数据·开源·能源·能源管理系统·石膏
得赢科技4 小时前
2025年GEO营销应用白皮书 - 服务业区域推广深度剖析
大数据·人工智能
GIS数据转换器4 小时前
基于GIS的宠物救助服务平台
大数据·人工智能·科技·机器学习·无人机·智慧城市·宠物
Solar20254 小时前
工程材料企业如何借助数字化工具突破获客瓶颈:方法论与实践路径
大数据·人工智能·物联网