Hive数据倾斜

数据倾斜

map reduce任务执行时,reduce节点任务大部分执行完毕,但是有一或几个reduce任务运行很慢,导致任务进度一直卡在99%,这是因为某一个key的条数比其他key多得多,所在reduce节点的数据量就比其他节点大很多,从而导致某几个节点的reduce任务迟迟不能运行完

原因

1.空值导致数据倾斜:空值不参与关联,赋予空值新的key值(减少IO)

2.不同数据类型关联产生数据倾斜

解决方法

参数配置

1.hive.groupby.skewindata=true

此方法会生成两个MR任务,第一个map的输出结果集合会随机分不到reduce中,每个reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分到不同夫人reduce中,达到负载均衡的目的,第二个MR任务再根据预处理的输出结果按照GroupByKey分布到reduce中(这个过程可以保证相同的GroupByKey被分到同一个Reduce中),最后完成最终的聚合操作。

2.hive.map.aggr=true  Map端部分聚合,相当于Combiner

SQl语句优化

1.大小表关联:使用Map Join让小的维度表先进内存。在map端完成reduce

2.大表和大表关联:把空值NULL的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果

3.大表Join的数据倾斜

    3.1map输出key数量极少,导致reduce端退化为单机作业

            对Join的一个表去重,以此结果过滤大表的无用信息,使用mapjoin

    3.2map输出key分布不均,导致少量key对应大量value,致使reduce端单机瓶颈

            切分join中的一个表,以便将切片(使用hive抽样函数)全部载入内存,然后多次采用 map             join得到结果

hive map和reduce优化:map和reduce任务启动和初始化会造成时间和资源浪费

减少map数:有很多小文件(远远小于128M)

合并小文件 

set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;

set mapred.min.split.size.per.rack=100000000;

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

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