目录
一、问题描述
二、尝试调整参数
三、查看spark具体sql流程图
一、问题描述
有一个dwd层中间表的入表任务,有几天的日期永远无法执行成功,平时的任务时间大概在2分钟。之前也遇到过一次这样的情况,是通过排查脏数据得到了解决(长字符串id中有不规则脏字符),这次实在没有头绪。
二、尝试调整参数
因为查看yarn任务的页面,发现总是报错在拒绝连接,看到有个别任务总是执行半天卡住,并且shuffle的records数量也明显高于其他exceutor,并且不仅spill到内存,甚至到了磁盘,说明还是数据倾斜。于是上网查找优化资料,陆续调整了几个参数:
--conf spark.shuffle.sort.bypassMergeThreshold=5000 (该参数应该是设置不合理,作用也不明显,后剔除)
--conf spark.reducer.maxSizeInFlight=256M
--conf spark.shuffle.file.buffer=96K
当加上第3个参数之后,任务不会那么快跑崩了,但最后还是存在问题。
也考虑在join的key上增加随机数前缀(2表关联,a表增加0-n随机数前缀,b表扩充随机数范围的n倍(0到n每个都作为前缀放到b表前,这样保证能和a表关联上)),但是任务sql较大,关联表过多,所以即便加随机数也要知道加在哪一步。于是决定查看spark的执行计划的sql流程图。
三、查看spark具体sql流程图
整个图很长,但是只要没有spill信息的都不太重要,最后发现了红框的地方,找到上游表。但是看到这个表的时候,我十分困惑,因为这个表是目的表的前7天数据,里面包含新用户和回流用户。按理说新用户和回流用户即便是多天融合,也不应该存在重复,但是口说无凭,查询这些天的新用户表,进行查看:
?
果然!新用户表存在id重复现象。那么一个是反馈给上游做表的同学(次要),一个是采取去重处理(主要,因为重复不多,而且之前验证过一天的新用户是没有重复的,所以考虑仍为uuid哈希碰撞这样的原因) 。
最终只要在有重复的表加一句group by 去重即可。
最后一天只要3分钟就成功跑完,问题解决。?
|