Hive倾斜
- 数据倾斜的原因
Hive倾斜的原因很大部分是由于sql中的join语句与group by语句。
原因:对于普通的join操作,会在map端根据key的hash值,shuffle到某一个reduce上去,在reduce端做join连接操作,内存中缓存join左边的表,遍历右边的表,依次做join操作。所以在做join操作时候,将数据量多的表放在join的右边。
当数据量比较大,并且key分布不均匀,大量的key都shuffle到一个reduce上了,就出现了数据的倾斜。 - 数据倾斜的优化
1.如果是join 过程中出现倾斜应将此项设置为true。
hive.optimize.skewjoin.compiletime=true;
在进行两个表join的过程中,由于hive都是从左向右执行,要注意讲小表在前,大表在后(小表会先进行缓存)。
不影响结果可以考虑过滤空值
<property>
<name>hive.optimize.skewjoin.compiletime</name>
<value>false</value>
</property>
2、如果是group by过程出现倾斜应将此项设置true。
hive.groupby.skewindata=true;
<property>
<name>hive.groupby.skewindata</name>
<value>false</value>
<description>Whether there is skew in data to optimize group byqueries</description>
</property>
问题:为什么默认为false?
因为开启为true后,会至少开启两个MapReduce,执行时间比开启一个长,因此最好出现数据倾斜之后在开启。
hive.optimize.skewjoin.compiletime=true; 如果是join过程出现倾斜应该设置为true
此时会将join语句转化为两个mapreduce任务,第一个会给jion字段加随机散列
set hive.skewjoin.key=100000; 这个是join的键对应的记录条数超过这个值则会进行优化。
https://www.cnblogs.com/qingyunzong/p/8847597.html