Hive数据倾斜

Hive数据倾斜的表现就是任务处在99%或者100%,但是却没有结束(偶尔还在100%时出现OOM现象)。

原因:

key分布不均匀,在reduce阶段,大量数据分配到一个reduce中处理。

解决方案:

hive.map.aggr=true

Map 端部分聚合,相当于Combiner

hive.groupby.skewindata=true

有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。


null值存在也会造成数据倾斜,所以在处理null值时需要注意。

count distinct时,可以过滤到null值,将最终结果再加1(是否加1还是要看结果是否有空值)。


hive.auto.convert.join=false(关闭自动MAPJOIN转换操作)
hive.ignore.mapjoin.hint=false(不忽略MAPJOIN标记)
hive.mapjoin.smalltable.filesize(默认值为2500000(25M),通过配置该属性来确定使用该优化的表的大小,如果表的大小小于此值就会被加载进内存中)

ps:mapjoin是在map阶段将小表加载到内存中,在用大表去连接匹配。一般的不等连接这时候就可以用where操作实现了,因为where是在map阶段实现的,所以join的时候也会执行where操作。


发表评论