group by 引起的倾斜优化如何解决?

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。

  • 第一个 MapReduce Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个Reduce 做部分聚合操作并输出结果。这样处理的结果是相同的 GroupBy Key 有可能被分布到不同的 Reduce 中,从而达到负载均衡的目的;
  • 第二个 MapReduce Job 再根据预处理的数据结果,按照 GroupBy Key 分布到 Reduce 中(这过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
标签: reduce、供应商、倾斜、groupby、group、面试
  • 回复