9.3.5 group by
优化
默认情况下,Map 阶段同一 Key 数据分发给一个 reduce,当一个 key 数据过大时就倾斜了。
很多聚合操作可以放在 Map 阶段来完成, 并不是所有的聚合必须在 Reduce 阶段完成, 最后在Reduce端得出最终结果。
- 开启 Map 聚合
hive.map.aggr = true
- 设置在 Map 聚合的的条目数的上限.,超过该值则进行分拆,默认是100000
hive.groupby.mapaggr.checkinterval = 100000
有数据倾斜的时候进行负载均衡
hive.groupby.skewindata = true
当选项设定为
true
,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;
第二个 MR Job 再根据第一个 MR Job 的数据结果按照 Group By Key 分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。