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

相关推荐
不是很大锅4 分钟前
卸载TDengine
大数据·时序数据库·tdengine
qyr678923 分钟前
深度解析:3D细胞培养透明化试剂供应链与主要制造商分布
大数据·人工智能·3d·市场分析·市场报告·3d细胞培养·细胞培养
2501_944934732 小时前
工业大数据方向,CDA证书和工业数据工程师证哪个更实用?
大数据
麦兜*3 小时前
深入解析现代分布式事务架构:基于Seata Saga模式与TCC模式实现金融级高可用与数据最终一致性的工程实践全解析
分布式·金融·架构
迎仔3 小时前
04-快反部队:Impala, Presto & Trino 通俗指南
大数据
BYSJMG3 小时前
计算机毕业设计选题推荐:基于大数据的肥胖风险分析与可视化系统详解
大数据·vue.js·数据挖掘·数据分析·课程设计
難釋懷3 小时前
分布式锁-redission功能介绍
分布式
yqd6663 小时前
elasticsearch
大数据·elasticsearch·搜索引擎
Leo.yuan4 小时前
经营分析会,该讲些什么?
大数据·数据库·数据分析
GIS数据转换器4 小时前
基于AI的低空数联无人机智慧巡查平台
大数据·人工智能·机器学习·无人机·宠物