提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、什么是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数据倾斜的简单的介绍及解决办法的探讨,请批评指正,谢谢!
相关文章
暂无评论...