解决Hive表关联查询数据倾斜的问题

1) 过滤掉脏数据:如果大key是无意义的脏数据,直接过滤掉。本场景中大key无实际意义,为非常脏数据,直接过滤掉。

2)数据预处理:数据做一下预处理,尽量保证join的时候,同一个key对应的记录不要有太多。

3) 增加reduce个数:如果数据中出现了多个大key,增加reduce个数,可以让这些大key落到同一个reduce的概率小很多。

4) 转换为mapjoin:如果两个表join的时候,一个表为小表,可以用mapjoin做。

5) 大key单独处理:将大key和其他key分开处理

6)hive.optimize.skewjoin:会将一个join sql 分为两个job。另外可以同时设置下hive.skewjoin.key,默认为10000。参考:

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

参数对full outer join无效。

7)调整内存设置:适用于那些由于内存超限内务被kill掉的场景。通过加大内存起码能让任务跑起来,不至于被杀掉。该参数不一定会明显降低任务执行时间。如:

setmapreduce.reduce.memory.mb=5120 ;

setmapreduce.reduce.java.opts=-Xmx5000M -XX:MaxPermSize=128m ;

原文地址:https://www.cnblogs.com/successok/p/14218967.html