一: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分钟左右)