数据倾斜
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;<br />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;
网友评论