Hive 数据倾斜的优化

7 篇文章 0 订阅
4 篇文章 0 订阅

一:Hive数据倾斜产生的原因和解决方案

##1.1:原因:
数据倾斜产生的原因是有与数据的key的分布严重不均导致的,少部分Reduce Job接收了大部分数据。所以业务逻辑、数据量、代码、以及集群配置都会导致数据倾斜。

##2.2 解决方案
1:参数优化
set hive.map.aggr=true (在map中会做部分聚集操作,效率更高但需要更多的内存)
set hive.groupby.skewindata=true;(数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。)

2:增加reduce 的jvm内存,增加reduce个数
3:代码优化
例如把distinct由group by取代替,distinct的时候如果特殊值太多,会导致特殊值聚集到同一个reduce上。

二:笛卡尔积导致的数据倾斜优化

这种场景比较特殊,是因为在笛卡尔的时候Hive是没有Join Key的,所以只会启动一个Reduce来处理,从而导致数据倾斜
解决方式有两种:
##1:Map join:就是在Map端完成Join工作,我实际下来没成功,还是很耗时
##2:手工添加一个Join key:这种方式是给两张表添加一个Join key,如随机数。从而是数据能够均匀的输出到多个Reduce。(在用户分层的项目中我就采用类这种方式优化:1:把日期维表扩展10倍,然后把用户等级事实表的uid%10的值关联随机Key上, 从而使是数据能够均匀分散到多个Reduce Job上。优化前无法跑出数据,优化后再20分钟左右)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值