Hive出现数据倾斜问题如何解决?

提问者:帅平 问题分类:面试刷题
Hive出现数据倾斜问题如何解决?
6 个回答
浅语望月
浅语望月
单独处理倾斜key
一般来讲倾斜的key都很少,我们可以将它们抽样出来,对应的行单独存入临时表中,然后打上随机数前缀,最后再进行聚合。或者是先对key做一层hash,先将数据随机打散让它的并行度变大,再汇集。其实办法一样。
发布于:5个月前 (11-20) IP属地:四川省
曾经多难忘
曾经多难忘
sort by代替order by
将结果按某字段全局排序,这会导致所有map端数据都进入一个reducer中,在数据量大时可能会长时间计算不完。使用sort by,那么还是会视情况启动多个reducer进行排序,并且保证每个reducer内局部有序。为了控制map端数据分配到reducer的key,往往还要配合distribute by一同使用。如果不加distribute by的话,map端数据就会随机分配到reducer。
发布于:5个月前 (11-20) IP属地:未知
自愈
自愈
Join相关的优化如下:
Hive在解析带join的SQL语句时,会默认将最后一个表作为大表,将前面的表作为小表,将它们读进内存。如果表顺序写反,如果大表在前面,引发OOM。不过现在hive自带优化。
map join:特别适合大小表join的情况,大小表join在map端直接完成join过程,没有reduce,效率很高。
多表join时key相同:会将多个join合并为一个MR job来处理,两个join的条件不相同,就会拆成多个MR job计算。
发布于:5个月前 (11-20) IP属地:四川省
下个站口、等迩
下个站口、等迩
hive自带了一个参数:
hive.groupby.skewindata=false

这个参数默认是false表示不启用,我们可以启用一下,如果启用了,那么在group by时启动两个MR job。第一个job会将map端数据随机输入reducer,每个reducer做部分聚合,相同的key就会分布在不同的reducer中。第二个job再将前面预处理过的数据按key聚合并输出结果,这样就起到了均衡的效果。
发布于:5个月前 (11-20) IP属地:未知
有个笨蛋住进我心
有个笨蛋住进我心
map端做预聚合,也就是group by时,combiner在map端做部分预聚合,可以有效减少shuffle数据量。同时设置checkinterval(预聚合的行数阈值),超过该值就会分拆job。设置这个阈值的配置如下:
hive.map.aggr=true //默认
hive.groupby.mapaggr.checkinterval=100000 // 默认
发布于:5个月前 (11-20) IP属地:四川省
我来回答