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

相关推荐
云老大TG:@yunlaoda3601 小时前
如何进行华为云国际站代理商跨Region适配?
大数据·数据库·华为云·负载均衡
Wang's Blog1 小时前
Kafka: 消费者核心机制
分布式·kafka
字节数据平台2 小时前
刚刚,火山引擎多模态数据湖解决方案发布大数据运维Agent
大数据·运维·火山引擎
YangYang9YangYan2 小时前
2026高职会计电算化专业高价值技能证书
大数据·学习·区块链
老蒋新思维2 小时前
从「流量算法」到「增长算法」:AI智能体如何重构企业增长的内在逻辑
大数据·网络·人工智能·重构·创始人ip·创客匠人·知识变现
五度易链-区域产业数字化管理平台3 小时前
大数据与 AI 赋能招商全流程:五度易链平台的技术架构与实践应用解析
大数据·人工智能
学海_无涯_苦作舟3 小时前
分布式事务的解决方案
分布式
Moonbeam Community3 小时前
Polkadot 2025:从协议工程到可用的去中心化云平台
大数据·web3·去中心化·区块链·polkadot
阿里云大数据AI技术4 小时前
DataWorks 又又又升级了,这次我们通过 Arrow 列存格式让数据同步速度提升10倍!
大数据·人工智能
dixiuapp5 小时前
设备维修记录系统,从数据沉淀到价值挖掘的跃迁
大数据·数据库·人工智能