文章目录
hive不怕数据多,就怕数据倾斜。
1. 数据倾斜
hive容易产生数据倾斜的场景:
1)group by 不和聚合函数一起使用
2)reduce join
3) count(distinct )
2.hive的优化:
1 好的模型设计
2 解决数据倾斜
在map端进行join,减少reducetask数据量
聚合函数和group by结合使用
null值不参与连接
3 减少job数
4 设置合理的map reduce的task数,手动指定一般不超过datanode的95%
5 对小文件进行合并,减少maptask
6 单个作业最优不如整体最优
1)排序的选择:
order by 性能比较低的
sort by 局部排序
distribute by 分桶|分区
cluster by 分+排序
2)尽量避免使用笛卡尔积
hive 笛卡尔积是没有关联建的关联 转换为MR的时候 mapkey
select * from a,b; select * from a join b;
若需求中必须做笛卡尔积,最好自己设定一个关联建
表1:1000万 条数据
表2:20万 条数据 1-1000
1)对小表额外添加一个建 作为关联使用的建 随机产生
大表进行复制操作 小表有多少个不同的关联建 大表就复制多少份 大表的每一个复本的关联建就是小表中其中一个数据的关联建
2)大表随机生成一个关联建
小表进行复制 大表的不同的关联建的份数
第二种方式更加合理
1)reducetask的并行度高 分区数量更多
2)每一个reducetask中数据量不是太大
select cast(rabd()*1000 as int),* from stu;
3)使用join替代in/exists
hive 1.2.1 1.2.2 不支持
hive 2.3.2 支持 但是性能低 mapkey
select * from stu where age in(18,20,30,34);
mapkey null value:表的所有数据
高效替代方案:
left semi join
inner join
4)多重查询| 数据插入
能使用多重查询 不使用单重查询
数据插入:能使用多重插入 不使用单重插入
减少对表的扫描次数 提升性能的
from 表
insert into table ... where
insert into ......
使用multi group by