今天在hive任务跑批碰到了失败的问题,报错基本都是container killed,进一步看了任务日志,发现是某一个reducer失败了 耗时特别长,继续看了是在distribute by 这个算子涉及的MR任务的原因
(一个脚本中会涉及到很多个MR任务)
首先回顾下 distribute by 算子 一般是放在最后写文件 ,比如insert overwrite 操作之后进行,大概有distribute by rand() 和 distribute by partitions,后者一般用于多级分区的时候,目的是为了避免出现随机小文件的问题,区别是后者按照分区进行shuffle然后reducer计算,有几个key就有几个reducer,可能导致数据倾斜,前者是随机分发到set的reducer数量上,比如set有50个reducer,就平均分发到50个reducer进行计算。
回到这次的问题,是由于最后distribute by时候涉及的MR任务中某一个reducer时间过长,明显是数据倾斜问题。代码中最后是distribute by partitions,但是由于其中一个分区的某一个key值对应的数据量占了九成,导致对应的那个reducer在处理的时候hold不住了
解决办法:改成distribute by rand(),让50个reducer平均处理文件,避免了数据倾斜的情况,大大 提升了计算效率