赞
踩
有时join超时是因为某些key对应的数据太多,而相同的kkey对应的数据都会发送到相同的reducer上,从而导致内存不够,此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在sql语句中进行过滤
有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分布到不同的reducer上
如果不指定MapJoin或者不符合MapJoin的条件,那么hive解析器会将Join操作转化成Common join,即:在Reduce阶段完成join。容易发生数据倾斜,可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理
默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。
(1)开启Map端聚合参数设置,默认为True
hive.map.aggr = true
(2)在Map端进行聚合操作的条目数目
hive.groupby.mapaggr.checkinterval = 100000
(3)有数据倾斜的时候进行负载均衡(默认是false)
hive.groupby.skewindata = true
数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换,虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的
尽量避免笛卡尔积,join的时候不加no条件,或者无效的on条件,hive只能使用1个reduce来完成笛卡尔积
使用Combine可以大量的减少数据频率倾斜和数据大小倾斜,在可能的情况下,combine的目的就是聚合并精简数据
可以通过对原始数据进行抽样得出的结果集来预设分区边界值
把导致倾斜的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后不影响最终的结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。