1,解决数据倾斜
hive数据倾斜基本发生在group by,join,distinct等需要数据shuffle的操作中,这些过程都会根据key值汇集数据,由于key值过于集中,使得某一个reduce任务要进行大量数据汇集,这就会导致数据倾斜,结果会出现map100%,reduce长时间99%的现象
1,Group by 产生数据倾斜解决方法
- 这个配置代表开启map端聚合,相当于使用combiner
set hive.map.aggr=true
- 这个选项设定为ture,会有两次MR,第一次会将通过key分组后的结果随机均匀的发给各个reduce进行部分聚合预处理,从而达到负载均衡的目的第二次MR会把预处理的结果再根据key值分好组给各个reduce完成聚合操作.
set hive.groupby.skewindata=true
2,HQL包含 join 产生数据倾斜解决方法
- 小表join大表解决方法
使用mapjoin(小表)先将表加载到内存中
例如a为小标,b为大表
select /*+mapjoin(a)*/* 字段 from a join b on a.c1=b.c1;
- 当遇到关联字段为null的时候
1,让该字段不参与关联
select columns
from a left join b
on a.id is not null
and a.id=b.id
union all
select *
where a.id is null
2,给该字段随机分配key值
select columns
from a left join b
on case when a.id is null
then concat('hive',rand())
else a.id end=b.id
第二种方法比第一种方法效率高,因为是减小了IO和作业jobs数,所以效率更高
- 当遇到关联字段数据类型不同的时候
转换类型进行操作
3,HQL包含 count(distinct ) 产生数据倾斜解决方法
如果数据量很大 ,而distinct 会shuffle数据到一个reduce处理,就会导致数据倾斜
解决方法 distinct 用group by代替
4,HQL优化之map Reduce 产生数据倾斜解决方法
如果小文件很多,就需要把他们合并 可以使用 set hive.merge.mapfiles=true
如果单个文件稍大于配置文件block的大小,或者map计算量比较大
需要设置配置文件
set hive.mapred.map.tasks=num
来增加map的个数(num)
2,设计好的模型
hive 三大建模方法
范式建模
范式 | 判断 |
---|---|
第一范式 | 属性是否具有原子性,是否可再分 |
第二范式 | 非主属性对码是否存在部分依赖 |
第三范式 | 非主属性对码是否存在传递依赖 |
BC范式 | 主属性对码是否存在部分依赖和传递依赖 |
候选码是能唯一表示一个实体的最小属性集合,比如说学生,学号,成绩
学生和学号就是候选码
超码包含候选码
比如说{学生,学号,成绩}或者{学生,学号}
主码:候选码中选一个作为主码
非主属性:不包含候选码的属性列
主属性: 包含候选码的属性列
实体建模
维度建模