网站公告怎么做,包装设计征集网站,做网站的外部链接关系分析的工具,想做一个网站spark sql 数据倾斜–join 同时开窗去重的问题优化 文章目录 spark sql 数据倾斜--join 同时开窗去重的问题优化结论1. 原方案#xff1a;join步骤时#xff0c;同时开窗去重数据倾斜 2. 优化2.1 参数调优2.2 SQL优化 背景#xff1a; 需求#xff1a;在一张查询日志表中join步骤时同时开窗去重数据倾斜 2. 优化2.1 参数调优2.2 SQL优化 背景 需求在一张查询日志表中有百亿数据需要join上维表再根据几个字段进行去重 结论
开窗去重和join一定要分步进行按照需求先做join再开窗或者去重完成后在进行join。
1. 原方案join步骤时同时开窗去重
dwd_tmp1 中存在百亿用户查询日志数据
insert into table dws_tmp1 partitions(weekxxxx)
select
c1,
c2,
c3,
c4,
other..
from(select t1.*,-- 开窗去重row_number row_number() over(partition by c1,c2,c3,d1.c5 order by c1,c3,d1.c5,c2) as rank from dwd_tmp1 t1-- join 维表left join dim_d1 d1 on t1.idd1.id
)t2
where t2.rank 1数据倾斜
数据量超百亿资源给到200 * 2c * 20G执行引擎为spark。由于环境涉及公司机密不便放图只谈生产调优经验。
在执行上面SQL代码观察调度spark任务信息总共划分为5个stage【0-4】stage2 会一直卡顿shuffle容量膨胀到数百G点进stage2中存在几个task 读和写的容量超20G其他一般都在几百M。经过多次测试stage2卡顿时间在2H左右。
2. 优化
2.1 参数调优
distribute by 只对最后写入数据块的数据分布起效果对中间的shuffle分区数量无用。
spark.sql.shuffle.partitions由于提交执行的代码是spark sql所以设置spark.sql.shuffle.partitions数量经过分析spark SQL的代码执行计划该参数配置能有效改变代码执行过程中各个stage的shuffle分区数量。多测测试【600-4000】范围之间效果并不理想stage2还是存在卡顿稍微好一点1.7h。
注意spark.default.parallelism只有在处理RDD时有效
官网建议: spark.sql.shuffle.partitions设置为当前spark job的总core数量的2~3倍
2.2 SQL优化
最终回归到SQL问题分析上将上面SQL拆分一步一步进行测试执行发现都执行很快所以问题直接定位到开窗去重和join同步进行的位置。
最终解决用子查询进行join之后再开窗去重由于开窗去重中有一个字段是需要关联维表获取效果明显。相同的资源配置参数下10m完成运行最后调整合适资源。