Hive 数据倾斜

现象:任务卡在map 100% reduce 99%,分布式计算时,

优化目标:使map的结果更均匀的分布到reduce中去

SQL调节

1.join的关联字段选取分布均匀的表作为驱动表,同时可以尽可能的裁剪表,使关联的集合变小。当大小表关联时,使小表先进内存;当大表关联大表时,考虑把空值变成一个随机串concat('hive',rand()),把倾斜数据分布到不同的reduce上。

2.使用group by代替distinct,distinct会将所有的distinct字段放在同一个reducer里面,即存在数据倾斜,而group by会分散到多个reducer里面,避免了某个节点负荷过高而其他节点无负荷的情况

当group by的不同分组的数据量差异很大时,可以设置参数

set hive.map.aggr=true 表示是否在map端聚合

set hive.groupby.skewindata=true 均衡reduce的处理量

3.over函数会导致数据倾斜,尽可能的减少数据量

4.set hive.auto.convert.join=true; 适用于大表关联小表时,将小表自动放入内存中

   set hive.mapjoin.smalltable.filesize = 25000000;  默认25m

show create table 查看表大小

5.set hive.optimize.skewjoin = true; 

   set hive.skewjoin.key = skew_key_threshold (default = 100000)

   hive 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce, 一般可以设置成你(处理的总记录数/reduce个数)的2-4倍都可以接受

6.大表与小表关联时,使用/*+ mapjoin(表名)*/将小表放入内存

你可能感兴趣的:(Hive 数据倾斜)