【HIVE数据倾斜常见解决办法】

2年前 (2023) 程序员胖胖胖虎阿
151 0 0

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、什么是HIVE数据倾斜?
  • 二、数据倾斜原因及解决办法
    • 1. Join 倾斜
        • a. 大表 Join 小表
        • b. 大表 Join 大表
    • 2. Group by 倾斜
    • 3. Count distinct 倾斜
  • 总结

#博学谷IT学习技术支持#

前言

HIVE数据倾斜是HIVE必备、必问知识点。了解什么是数据倾斜、倾斜的原因以及如何解决倾斜,非常有必要。以下是个人总结。


一、什么是HIVE数据倾斜?

HIVE处理的数据分布不均匀,导致某一个或几个节点处理的数据量巨大,就会造成数据倾斜。
具体表现是,整个任务进度长时间处于99%附近,在yarn的任务详情页面发现大部分reduce都运行完成,只有一个或者几个reduce任务在长时间执行,是由于该reduce任务处理的数据量远远大于其他任务。

二、数据倾斜原因及解决办法

在实际项目中,主要三种情况会遇到数据倾斜,分别是join操作、group by 操作和count distinct 操作。

1. Join 倾斜

a. 大表 Join 小表

  • 倾斜原因:主要是热点key导致,在shuffle过程中,相同的key会基于hash分发到同一个reduce算子上,导致join时倾斜。
  • 解决办法:开启map端join: set hive.auto.convert.join = true; 默认是打开的。
    – 开启该设置后,join时会在map端将小表缓存到内存中(缓存为hash table),在map端执行join。
    – 小表默认是 1000行或者25Mb大小。可以通过设置参数提高小表的阈值 : set hive.mapjoin.smalltable.filesize=25000000;

b. 大表 Join 大表

  • 倾斜原因:跟大表Join小表倾斜原因差不多,存在热点key,或者大量无用的空key,导致倾斜。
  • 解决办法:
    – 运行时优化:采用skewjoin(倾斜关联)开启对倾斜数据join的优化: set hive.optimize.skewjoin=true; ,然后可以设置join倾斜阈值: set hive.skewjoin.key=100000; ,当join的key对应的记录条数超过100000,就认为这个key发生了数据倾斜,会对其分拆优化。
    – 编译时优化:通过设置: set hive.optimize.skewjoin.compiletime=true; 可以在编译SQL时将执行计划优化完成。但是,这个需要在建表时指定数据倾斜元数据信息。
    – 一般情况下,运行时优化和编译时优化都同时开启,并且要开启union优化: set hive.optimize.union.remove=true;
    – 除了以上三个参数外,还可以 * 通过子查询剔除空key 空key转为随机字符串 * 、* 大表拆分为小表分别join再union * 等方式进行优化。

2. Group by 倾斜

  • 倾斜原因:默认情况下,map阶段相同的key会分发到同一个reduce端聚合,热点key导致group by 聚合倾斜。
  • 解决办法:
    – 开启 map 端聚合: set hive.map.aggr = true; ,默认开启。这个设置会提前在map端聚合,减少数据传输及在reduce阶段的处理时间。通过 set hive.groupby.mapaggr.checkinterval = 100000; 设置在map端聚合操作的条数。当大于该值时,才会进行map端聚合。
    – 开启负载均衡: set hive.groupby.skewindata = true; ,该设置会在数据出现倾斜时,将一个group by 的执行计划拆分为两个阶段MR,第一阶段将key随机分发到不同reduce进行聚合,然后第二阶段MR会基于前一阶段预处理的结果,将相同的key分发到同一个reduce算子,执行聚合操作。

3. Count distinct 倾斜

  • 倾斜原因:所有key会分发到同一个reduce进行去重统计个数,数据量较大时导致运行时间过长。
  • 解决办法:将 count distinct 改写为 group by 的写法。目的是增加一个MR的操作。
	select count(distinct id) from table; 
	改写为:
	select count(t1.id) from (select id from table group by id) t1;

总结

以上就是个人对HIVE数据倾斜的简单的介绍及解决办法的探讨,请批评指正,谢谢!

版权声明:程序员胖胖胖虎阿 发表于 2023年3月21日 上午4:32。
转载请注明:【HIVE数据倾斜常见解决办法】 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...