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掉的场景。通过加大内存起码能让任务跑起来,不至于被杀掉。该参数不一定会明显降低任务执行时间。如:
set mapreduce.reduce.memory.mb=5120 ;
set mapreduce.reduce.java.opts=-Xmx5000M -XX:MaxPermSize=128m ;