hive数据倾斜
-
什么是数据倾斜
- 数据倾斜主要表现在map/reduce程序执行时,reduce节点大部分执行完毕,但是又一个或者几个reduce节点运行很慢,导致整个程序的处理时间长,这是因为某一个key的条数比其他key多很多,这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完
-
数据倾斜常见原因
关键词 情形 后果 解决方法 join 其中一个表较小,但是key集中 分发到某一个或者几个Reduce上的数据远高于平均值 小表在join左侧,或者使用mapjoin将小表加载到内存里 join 大表与大表,但是分桶的判断字段0或者空值过多 这些空值都交由一个reduce处理 滤掉空值,或者给空值分配随机的key值 group by group by 维度过小,某值的数量过多 处理某值的reduce非常耗时 首先在map端聚合,最后在reduce端聚合 count distinct 某特殊值过多 处理此特殊值的reduce耗时 使用sum…group by 代替 -
其他情形
- set hive.map.aggr=true(默认开启) map段部分聚合,相当于combiner
- set hive.groupby.skewindata=true(默认关闭) 有数据倾斜的时候进行负载均衡,当选项设定为true时,生成的查询计划会有两个MR Job.第一个MR job中,Map 的输出结果集合会随机分不到Reduce中, 每个Reduce做部分聚合操作,并输出结果,这样处理会使相同key值的数据可能被分发到不同的reduce中,从而负载均衡;第二个MR job 再根据预处理的数据结果按照group by key 分布到reduce中,最后完成最终的聚合操作
- 单个文件大小稍稍大于配置的block块的大小,此时需要适当增加map的个数. set mapred.map.tasks个数
- 文件大小适中,但map端计算量非常大,需要增加map个数 set mapred.map.tasks 个数 或者 set mapred.reduce.tasks 个数
- 小文件过多,需要合并小文件.可以通过set hive.merge.mapfiles=true 来解决