企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
默认情况下,Map 阶段同一 Key 数据分发给一个 reduce,当一个 key 数据过大时就会产生数据倾斜。但在数据计算时,并不是所有的聚合操作都需要在Reduce 端完成,很多聚合操作都可以先在 Map 端进行部分聚合,最后在 Reduce端得出最终结果。 <br/> **开启Map端聚合:** ```sql -- 开启在Map端聚合。默认就是true,开启 hive(default)> set hive.map.aggr=true; -- 在Map端进行聚合的条目数目 hive(default)> set hive.groupby.mapaggr.checkinterval=100000; -- 在数据倾斜时进行负载均衡 --默认是false,关闭 hive(default)> set hive.groupby.skewindata=true; ``` 当`hive.groupby.skewindata=true`时,生成的查询计划会有两个 MR Job。 (1)第一个Map Job: Map 的输出结果会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce中,从而达到负载均衡的目的; (2)第二个Map Join: 第二个 MR Job 再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。