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

相关推荐
GeeLark8 分钟前
#请输入你的标签内容
大数据·人工智能·自动化
小邓吖15 分钟前
自己做了一个工具网站
前端·分布式·后端·中间件·架构·golang
智能相对论36 分钟前
2万台?九识无人车车队规模靠谱吗?
大数据
小小王app小程序开发2 小时前
淘宝扭蛋机小程序核心玩法拆解与技术运营分析
大数据·小程序
得物技术2 小时前
从“人治”到“机治”:得物离线数仓发布流水线质量门禁实践
大数据·数据仓库
Data_Journal3 小时前
【无标题】
大数据·服务器·前端·数据库·人工智能
zhangxl-jc4 小时前
StreamPark2.1.7 添加Flink Home 报错 base64 character 2d 解决方法
大数据·flink
峥嵘life4 小时前
Android 16 EDLA测试STS模块
android·大数据·linux·学习
洛阳纸贵4 小时前
JAVA高级工程师--Elasticsearch安装以及内置分词器、IK分词器
大数据·elasticsearch·搜索引擎
186******205314 小时前
项目开发基础知识:从概念到落地的全流程指南
大数据·人工智能