欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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