hive中数据倾斜问题的处理(hive调优)
程序员文章站
2022-07-14 15:24:32
...
hive中数据倾斜问题的处理(hive调优)
数据倾斜的概况
hive在处理大数据经常会遇到数据倾斜的问题,表现为在map100%,reduce99%…的界面一直卡着,一般情况下就是遇到了数据倾斜的问题
主要原因是大车拉小货,小车拉大货,计算能力强的节点处理数据少,计算能力弱的节点需要计算的数据比较多,有的节点完成任务休息了,有的节点还在边卡顿边干活,拖长执行的时间,导致工作效率的低下.
问题实例1
例如我们在hive中对大量数据进行group by的时候,遇到的数据某种类型的数据量特别多,而其他类型的数据量特别少,当程序在执行group by的时候,会将相同的group by字段的reduce任务拉取到同一个个节点进行聚合,这样的话其他任务少的阶段任务完成之后就会一直等待
任务多的节点,所以我们就会看到,map 100%,reduce 99%的情况一直出现.
问题实例1解决办法
去命令行执行以下两行代码
set hive .map.aggr=true(默认为true) //这个配置代表是否在map端进行聚合,相当于combiner(组合器)
set hive.groupby.mapaggr.checkinterval=100000 //在map端进行聚合操作的条目数目
set hive .groupby.skwindata=true(默认为falst) //生成的查询计划会有两个MR Hob.第一个MR Job中,Map的输出结果集合会被随机分配到Reduce中,从而达到负载均衡的目的,第二个MR Job再根据预处理的数据结果按照Group By Key分配到reduce中(这个过程可以保证两个group by key被分到同一个reduce中)最终完成聚合操作.
问题实例2
map和reduce优化
--1.当出现小文件过多,需要合并小文件的情况
set hive.merge.mapfiles=true//合并小文件
--2.单个文件稍稍大于配置的block块的情况
set mapred.map.tasks//增加map的个数
--3.文件大小适中,但是map端计算量非常大的情况
select id,count(*),sum(case when...),sum(case when...)...//增加map个数.
问题实例3
--hivesql中包含count(distinct)时,如果数据量非常大,执行
select a,count(distinct b)from t group by a ;//类似的SQL时,会出现数据倾斜的问题.
--解决办法: 用sum...group by代替,例如
select a ,sum(1) from (select a,b from t group by a,b)group by a;
问题实例4
当遇到一个大表格和一个小表进行join操作时,
解决办法:
使用mapjoin 将小表加载到内存中.
例如:
select /*+MAPJoin(a)*/
a.c1,b.c1,b.c2
from a join b
where a.c1=b.c1;
问题实例5
遇到需要join但是关联字段有数据为空,如表一的id需要和表二的id进行关联
解决办法1:id为空的不参与关联
比如:
select
*
from Log a join users b
on a.id is not null and a.id =b.id union all;
select * from log a where a.id is null;
--解决办法2:给空值随机分配key值
select
*
from log a left outer join users b
on case when a.user_id id null then councat('hive',rand()) else a.user_id end =b.user_id