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

相关推荐
SelectDB1 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康2 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
茶杯梦轩2 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
IvanCodes2 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康3 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
回家路上绕了弯3 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
字节跳动数据平台3 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康4 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
字节跳动数据平台5 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
得物技术5 天前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark