hive sql绝对是大数据从业者绕不开的需求,而数据量巨大,十亿、百亿时如何让任务运行得又快又准确,也是需求中永恒的命题。下面我回来介绍我在工作中遇到的问题,帮助大家在工作中优化算力需求,快速定位问题修复问题。
一.数据倾斜
表现
任务的map或reduce stage卡在99%很长时间不成功。 我遇到过最久的一次是一天多,10亿的数据量的join任务。
原因
某个job载了远超于其他job的工作量,导致其他job完成工作后,其还剩非常多的任务
排查及解决方法:
join任务
排查问题1:首先排查代码是否有错误,最典型的就是join任务没有设定on的规则导致的笛卡尔积,一般表现为reduce卡在60%左右非常久
解决方法1:增加on规则字段
排查问题2:再排查主表的联表字段是否有空值,且空值占比与其他值的占比差距较大,此时大量空值会被分到一个job中,使这个job承载了远超于其他job的工作量
解决方法2:增加随机数,on nvl(id, rand()) = id
排查方法3:再排查主表和副表的联表字段是否均有空值,这部分空值也会导致笛卡尔积
解决方法3:增加随机数填补
group by任务
排查group by字段是否有空值,且空值占比与其他值的占比差距较大
二.表数据量
深度了解语句的执行顺序,可以帮助我们优化代码以尽可能减少运算量
1.先筛选后join