执行一段HQL之后,报了如下错误
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTas
此错误只能通过yarn 日志进行查看,通过查看发现报OOM,解决OOM问题不能单纯增加计算空间,比如MAP以及REDUCE计算空间。
我们首先看一下日志错误阶段,
通过日志观察实在STAGE2阶段的map阶段就报错,并没有到REDUCE阶段。
那我们就可以来看看这段SQL explain 执行计划,计划如下图
发现第二阶段是发生inner join,就是在join阶段发生内存溢出,99%概率必然是发生倾斜或者笛卡尔积导致map阶段出现问题。
那我们该如何解决呢?是直接增加计算空间和并行度,我们要看一下SQL本身有没有问题
这段SQL如下
从这段SQL,我们可以看出是两张表内关联,再通过对数据探查发现,第一张表为小表,第二张表为大表,并且第二张表过滤后又加DISTICT,这块会影响型能,但绝不是报错主要原因,后期对关联条件发现大表package大量重复,这原因就很明显,发生1对多现象,绝对发生了倾斜现象。
那我们完全可以从代码层面进行优化。
优化SQL如下
对整体去重只需要一个job,采用开窗函数 row number over,并在最终希望获取的package在小表中,采用left semi join。
这样最终结果就跑成功了
遇到问题不要轻易就先通过设置参数进行解决
- 首先先从代码进行优化
- 其次再从设置参数 资源方面进行解决
关注老姜
哔哩账号:老姜的数据江湖
微信公众号:老姜的数据江湖