前言
简单来说,倾斜你可以理解为是分布不均。举个通俗的例子,有一份工作分给两个人,一个人分了99,另一个人分了1,虽然有了两个人,但整体效率还是被拉的很低。所以数据倾斜是什么呢?
一、数据倾斜到底是什么?
数据倾斜是指在原本应该并行处理的数据集中,某一部分的数据显著多于其它部分,从而使得该部分数据的处理速度成为整个数据集处理的瓶颈。
二、数据倾斜产生原因
a. map端:输入文件的大小不均匀
b. reduce端:key分布不均匀,导致分区不均匀
三、发生数据倾斜的常见场景以及解决办法
1. 大表和小表关联时
解决办法:多表关联时,将小表(关联键记录少的表)依次放到前面,这样可以触发reduce端更少的操作次数,减少运行时间
2. 大表和大表关联,其中某张大表 空值/0值较多
解决办法:
1.如果值本身是无效的,可以先剔除无效值,或者先处理一下赋予随机值
2.如果值本身是有效的,调整参数也是可以的
set hive.optimize.skewjoin = true
在运行时,会对数据进行扫描并检测哪个key会出现倾斜,对于会倾斜的key,用map join做处理,不倾斜的key正常处理
set hive.skewjoin.key = skew_key_threshold (default = 100000)
在参数 hive.optimize.skewjoin=true 时, Hive的reuce 任务会在处理join key 的时候 判断其数量是否大于该 阈值,如果是将作为一个Skew Join 处理
3. group by
解决办法:
1.调整参数
hive.map.aggr=true (默认true)这个配置项代表是否在map端进行聚合,相当于Combiner。
hive.groupby.skewindata=true (默认false)
2.剔除脏数据
4. hiveQL中包含count(distinct )时
count(dinsct )非常耗能,不建议这么写
解决方式:使用sum...group by代替。如select a,sum(1) from (select a,b from t group by a,b) group by a
四、总结
未需待完,如果错误,请各位指正,谢谢