解决hive中数据倾斜问题

定义

数据倾斜主要指:每个reduce拿到的数据量并不均衡。如何发现:查看每一个reduceTask执行时间,大部分的reduceTask都执行完成了, 只有其中一个或者几个没有执行完成, 此时认为发生了数据倾斜

jion数据倾斜

方案一:map join

通过 map join,bucket map join,smb Join 来解决数据倾斜, 但是 这种操作是存在使用条件的, 如果无法满足这些条件, 无法使用 这种处理方案

方案二:拆分处理倾斜部分

在执行MR的时候, 会动态统计每一个键的值出现重复的次数, 当这个重复的次数达到一定的阈值后, 认为当前这个键的数据存在数据倾斜, 对于数据倾斜严重的JOIN操作,可以将其拆分为多个步骤进行处理,先处理倾斜的部分,然后与其他正常数据进行合并
方法
set hive.skewjoin.key=100000; 阈值判断
set hive.optimize.skewjoin=true; – 开启运行期处理倾斜参数

方案三:数据重分布

数据重分布,使用hive的内置函数(distribute by和cluster by)或自定义函数对参与join的列进行哈希化或者随机化,均匀分部到不同的桶中。

方案四:动态调整并行度

动态调整并行度,可以根据实际情况动态调整join操作的并行度,减少或增加任务数量,平衡数据在各任务之间的负载。
可以使用hive的hive.exec.reducers.bytes.per.reducer属性来调整每个Reducer任务处理的数据量

group by数据倾斜

方案一: combiner

基于MR的 combiner(规约, 提前聚合) 减少数据达到reduce数量, 从而减轻倾斜问题。让每一个mapTask内部进行提前聚合, 然后到达reduce进行汇总合并得出结构
方法:只需要在HIVE中开启combiner提前聚合配置参数即可:
set hive.map.aggr=true;

方案二:大combiner方案

负载均衡的解决方案(需要运行两个MR来处理) (大combiner方案)
让第一个MR进行打散并对数据进行聚合计算 得出局部结果, 然后让第二个MR进行最终聚合计算操作, 得出最终结果
发法:只需要开启负载均衡的HIVE参数配置即可 set hive.groupby.skewindata=true;

方案三:数据重分布

可以使用Hive的内置函数或自定义函数对参与group by的列进行哈希或随机化,将数据均匀分布到不同的桶中。使用Hive的distribute by语句来指定数据分发方式,以确保数据在不同的Reduce任务之间均匀分布

方案四:动态调整并行度

可以根据实际情况动态调整group by操作的并行度,增加或减少Reduce任务的数量,以平衡数据在各个任务之间的负载。可以使用Hive的hive.exec.reducers.bytes.per.reducer属性来调整每个reduce任务处理的数据量

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值