Hive 优化策略
1. 数据倾斜
1) join 数据倾斜
当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因: hive 在对每行
记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算。
JOIN原则:
在使用写有 Join 操作的查询语句时有一条原则:应该将条目少的表 /子查询放在 Join
操作符的左边,原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内
容会被加载进内存,将条目少的表放在左边,可以有效减少发生 OOM 错误的几率。
Map Join:
Join 操作在 Map 阶段完成,不再需要 Reduce,前提条件是需要的数据在 Map 的过程
中可以访问到。
例如:
INSERT OVERWRITE TABLE phone_traffic
SELECT /*+ MAPJOIN(phone_location) */ l.phone,p.location,l.traffic from
phone_location p join log l on (p.phone=l.phone)
相关的参数为:
hive.join.emit.interval = 1000
hive.mapjoin.size.key = 10000
hive.mapjoin.cache.numrows = 10000
2) groupby 数据倾斜
Map 端部分聚合:
并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端进
行部分聚合,最后在 Reduce 端得出最终结果。
参数包括:
hive.map.aggr = true是否在 Map 端进行聚合,默认为 True;
hive.groupby.mapaggr.checkinterval =100000在 Map 端进行聚合操作的条目数目;
有数据倾斜的时候进行负载均衡
hive.groupby.skewindata = true
当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的
输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,
这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到
负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到
Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),
最后完成最终的聚合操作。