group by 引起的倾斜主要是输入数据行按照 「group by 列分布不均匀」 引起的。
比如,假设按照供应商对销售明细事实表来统计订单数,那么部分大供应商的订单量显然非常多,而多数供应商的订单量就一般,由于
group by 的时候是按照供应商的 ID 分发到每个 Reduce Task ,那么此时分配到大供应商的 Reduce Task
就分配了更多的订单,从而导致数据倾斜。
对于 group by 引起的倾斜,优化措施非常简单,只需设置下面参数即可:
set hive.map.aggr = true set hive.groupby.skewindata=true
此时Hive 在数据倾斜的时候会进行负载均衡,生成的查询计划会有两个 MapReduce Job。