表的优化
(1)小表join大表
hive版本升级后,小表join大表和大表join小表的执行计划查不了多少了
(2)mapjoin功能(默认是打开的)set hive.auto.convert.join = true;
将小表加入内存
(3)空值
空值导致的数据倾斜,可以将空值处理为concat(‘hive’, rand()),就是加一个随机数
(4)map端进行聚合
a.是否在Map端进行聚合,默认为True
hive.map.aggr = true
b.在Map端进行聚合操作的条目数目
hive.groupby.mapaggr.checkinterval = 100000
c.有数据倾斜的时候进行负载均衡(默认是false)
hive.groupby.skewindata = true
当选项设定为 true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作
(5)distinct操作
只要做distinct,就用不到分区。
select count(*) from (
select key from table1 group by key)a
(6)对表进行过滤后,再关联
select * from (select * from table1 where dt=‘2019-06-01’)a
join …
(7)select count(1) from tb where dt=‘2019-06-01’
改写为:select count(1) from tb where dt=‘2019-06-01’ group by dt
(8)慎用动态分区
MR优化
hive运行在MapReduce上,所以进行MR优化
(1)合理的map数:过多,初始化会比执行时间长,造成资源浪费。过少,则得处理一个map的时间过长,比较耗时
(2)合理的reduce数。有多少个reduce就会生成多少个小文件,reduce过多会小文件过多,也造成资源浪费
(3)对小文件进行合并
(4)对于大文件适当提高map数量
并行执行
JVM重用
分区、分桶
hive 优化
最新推荐文章于 2024-05-01 22:20:02 发布