Hive-Group by的优化(解决数据倾斜的问题)

待我称王封你为后i 2022-09-16 13:21 350阅读 0赞

Group by

默认情况下,Map 阶段同一 Key 数据分发给一个 reduce,当一个 key 数据过大时就倾斜。

为了解决group by数据倾斜的情况,可以采用Map端数据聚合的操作。
1)开启 Map 端聚合参数设置
(1)是否在 Map 端进行聚合,默认为 True

  1. set hive.map.aggr = true

(2)在 Map 端进行聚合操作的条目数目

  1. set hive.groupby.mapaggr.checkinterval = 100000

(3)有数据倾斜的时候进行负载均衡(默认是 false)

  1. set 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 中),最后完成最终的聚合操作。

表里的数据:

  1. hive (default)> select deptno from emp;
  2. OK
  3. deptno
  4. NULL
  5. 30
  6. 30
  7. NULL
  8. 30
  9. NULL
  10. NULL
  11. NULL
  12. NULL
  13. 30
  14. NULL
  15. NULL
  16. NULL
  17. NULL
  18. Time taken: 0.513 seconds, Fetched: 14 row(s)

没有开启map端聚合的负载均衡:

  1. hive (default)> select deptno from emp group by deptno;
  2. OK
  3. deptno
  4. NULL
  5. 30
  6. Time taken: 58.588 seconds, Fetched: 2 row(s)

优化以后:

  1. hive (default)> set hive.map.aggr = true;
  2. hive (default)> set hive.groupby.mapaggr.checkinterval = 100000
  3. hive (default)> set hive.groupby.skewindata = true;
  4. hive (default)> select deptno from emp group by deptno;
  5. OK
  6. deptno
  7. NULL
  8. 30
  9. Time taken: 21.544 seconds, Fetched: 2 row(s)

很明显,速度提升了不少,时间从58s降到21s.

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读