背景

A任务在凌晨1点到3点,平均耗时1h,且是核心公共任务,急需优化。
整体逻辑示意图:

// 从tableA读取一次数据,放到临时表t1
DROP TABLE IF EXISTS temp.tmp_xx_$date_1;
CREATE TABLE IF NOT EXISTS temp.tmp_xxx_$date_1
as
select
xxx
from  tableA
where xxxx;// 从临时表t1读取和转换数据,得临时表t2
DROP TABLE IF EXISTS temp.tmp_xx_$date_2;
CREATE TABLE IF NOT EXISTS temp.tmp_xxx_$date_2
as
SELECTdevice_id,c2
FROM
(SELECTdevice_id,c2,ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY time DESC) AS numFROM(select device_id,c2from  temp.tmp_xx_$date_1where !isempty(c2) )t
)t
WHERE t.num=1;// 从临时表t1读取和转换数据,得临时表t3
DROP TABLE IF EXISTS temp.tmp_xx_$date_3;
CREATE TABLE IF NOT EXISTS temp.tmp_xxx_$date_3
as
SELECTdevice_id,c3
FROM
(SELECTdevice_id,c3,ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY time DESC) AS numFROM(select device_id,c3from  temp.tmp_xx_$date_1where !isempty(c3) )t
)t
WHERE t.num=1;
// 从临时表t1读取和转换数据,得临时表t4
DROP TABLE IF EXISTS temp.tmp_xx_$date_4;
CREATE TABLE IF NOT EXISTS temp.tmp_xxx_$date_4
as
SELECTdevice_id,c4
FROM
(SELECTdevice_id,c6,ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY time DESC) AS numFROM(select device_id,c4from  temp.tmp_xx_$date_1where !isempty(c4) )t
)t
WHERE t.num=1
...
// 从临时表t1读取和转换数据,得临时表t7
DROP TABLE IF EXISTS temp.tmp_xx_$date_7;
CREATE TABLE IF NOT EXISTS temp.tmp_xxx_$date_7
as
SELECTdevice_id,c7
FROM
(SELECTdevice_id,c7,ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY time DESC) AS numFROM(select device_id,c7from  temp.tmp_xx_$date_1where !isempty(c7) )t
)t
WHERE t.num=1//t2关联t3-t7结果写入最终结果表
INSERT OVERWRITE TABLE biads.xxxx
PARTITION (pt_d='$date')
select
xxx
from  temp.tmp_xx_$date_2
left join  temp.tmp_xx_$date_3
left join  temp.tmp_xx_$date_4
...
left join  temp.tmp_xx_$date_7

排查思路

2.1 job,stage耗时分布
问题1: job太多 , 串行时间累加,导致整体耗时长
2.2 sql 执行dag图
问题2:存在8个表join,shuffle步骤多;
2.3 代码review
问题3:多表join时,存在大量重复逻辑。

解决方法

问题1: 保留必须的job, 合并重复逻辑,消除不必要的job(即临时表创建,一次临时表创建,代表一个job,且只能串行执行
问题2,3:使用 group by + max (split(concat(xxx))) 替代重复row_number逻辑

SELECT  device_id,SPLIT(MAX(CONCAT(time,'\001',c1)),'\001')[1]     AS c1,SPLIT(MAX(CONCAT(time,'\001',c2)),'\001')[1]        AS c2,SPLIT(MAX(CONCAT(time,'\001',c3)),'\001')[1]         AS c3,SPLIT(MAX(CONCAT(time,'\001',c4)),'\001')[1]           AS c4,SPLIT(MAX(CONCAT(time,'\001',c5)),'\001')[1]                c5 ,SPLIT(MAX(CONCAT(time,'\001',c6)),'\001')[1]          AS c6,SPLIT(MAX(CONCAT(time,'\001',c7)),'\001')[1]     AS c7FROM(SELECT  device_id,c1,c2,c3,c4,c5,c6,c7FROM temp.tmp_xx_$date_1where !isempty(c1) ) tGROUP BY  device_id

注意使用CONCAT而不是 CONCAT_ws, 因为要剔除掉c1-c7为空的情况,如果使用CONCAT_ws,恰好最近时间的c1-c7为空,也会保留空值,则不是我们想要的,而CONCAT遇到null,则整体结果直接Null,排序到最后, 从而实现剔除效果

测试验证count数,字段级count数

由于我们重构的复杂逻辑,所以必须验证重构后的行数,按特定维度聚合后行数,前后是否一致,这里我们以设备数为统计指标,结果表明 :
(1) 前后设备数一致
(2)按重要维度c1聚合后,设备数基本一致,存在一两百左右的误差,在可接受范围内。

优化后效果

消除了问题1,2,3,运行时间从1h降低到了10min.

Spark性能调优案例-多表join优化,减少shuffle相关推荐

  1. Spark性能调优案例-优化spark估计表大小失败 和 小表关联 走 broadcast join

    背景 A任务中关联一张表,该表经过过滤和去重,数据量小于10MB,实际任务耗时较长. B任务关联一张小表,实际任务耗时较长 排查思路 A任务排查 查看spark UIsql界面: 问题1:发现并没有走 ...

  2. Spark商业案例与性能调优实战100课》第20课:大数据性能调优的本质和Spark性能调优要点分析

    Spark商业案例与性能调优实战100课>第20课:大数据性能调优的本质和Spark性能调优要点分析 基于本元想办法,大智若愚,大巧若拙!深入彻底的学习spark技术内核!

  3. 【Spark调优】大表join大表,少数key导致数据倾斜解决方案

    [Spark调优]大表join大表,少数key导致数据倾斜解决方案 参考文章: (1)[Spark调优]大表join大表,少数key导致数据倾斜解决方案 (2)https://www.cnblogs. ...

  4. 【Spark调优】小表join大表数据倾斜解决方案

    [Spark调优]小表join大表数据倾斜解决方案 参考文章: (1)[Spark调优]小表join大表数据倾斜解决方案 (2)https://www.cnblogs.com/wwcom123/p/1 ...

  5. 大数据培训:Spark性能调优与参数配置

    Spark性能调优-基础篇 众所周知,正确的参数配置对提升Spark的使用效率具有极大助力,帮助相关数据开发.分析人员更高效地使用Spark进行离线批处理和SQL报表分析等作业. 推荐参数配置模板如下 ...

  6. Spark性能调优-RDD算子调优篇

    Spark性能调优-RDD算子调优篇 RDD算子调优 1. RDD复用 在对RDD进行算子时,要避免相同的算子和计算逻辑之下对RDD进行重复的计算,如下图所示: 对上图中的RDD计算架构进行修改,得到 ...

  7. Spark性能调优之资源分配

    **性能优化王道就是给更多资源!**机器更多了,CPU更多了,内存更多了,性能和速度上的提升,是显而易见的.基本上,在一定范围之内,增加资源与性能的提升,是成正比的:写完了一个复杂的spark作业之后 ...

  8. spark学习-Spark性能调优(1)

    本文要解决的问题: Spark在使用过程中不可避免的需要进行一系列的性能优化,本文就Spark性能调优的基础部分进行总结和归纳(开发调优和资源调优),参考了不少前辈的文章,在此非常感谢. 目的 在大数 ...

  9. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

最新文章

  1. train_test_split 数据集划分,样本划分
  2. NOIP模拟题 斐波那契数列
  3. python操作yaml的方法详解
  4. 模块修改-column_left.php
  5. python中的wheel有什么用_什么是Python Wheels?为什么要学Python Wheels
  6. JavaScript写贪吃蛇游戏,代码思路都有,想学的自己看
  7. 『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
  8. java 调用 ictclas50_1-Ictclas50分词系统ForJava
  9. struts2整合uploadify插件怎样传参数
  10. 《论文笔记》Collaborative Visual Inertial SLAM for Multiple Smart Phones
  11. 【Spring】Bean instantiation via constructor failed nested exception Constructor threw exception
  12. PCIe规范的扩展:SR-IOV(Single Root I/O virtual)网卡直通技术
  13. httpposterror_java – HttpClientError:目标服务器无法响应
  14. 创业者:永远站着顾客这边
  15. python3 readlines的参数_Python3 File readlines() 方法
  16. 递归处理vue菜单数据
  17. STM8L052低功耗模式
  18. uchome登陆机制分析(一)
  19. 云服务器ecs什么意思
  20. android资源文件assets

热门文章

  1. mtk设备模型之LCM--学习
  2. perl c语言,perl简介(适合对c语言有点认识的读者)_perl教程
  3. 协同过滤美食推荐系统(SSM,MySQL)+全套视频教程
  4. 6.0系统设备Root激活Xposed框架教程
  5. 小米7.0系统设备一键激活Xposed框架的教程
  6. 基于微信小程序宠物交易系统
  7. 【转】转自微信公众号 JavaScript 复杂判断的更优雅写法
  8. 高考学测计算机不合格会怎样,学业水平测试不过咋办 能参加高考吗
  9. 正则表达式,Math类,System类,日期日历对象
  10. [计算机毕业设计]关联挖掘的服装推荐系统