1.1Hive 调优
explain 关键字
explain select * from psn;
2.Hive 优化
Hive运行方式:
- 本地模式
- 集群模式
本地模式:set.hive.exec.mode.local.auto=true;
本地有很多的限制:
- 文件个数不能超过四个
- hive.exec.mode.local.auto.inputbytes.max默认值为128M,表示加载文件的最大值,若大于该配置仍会以集群方式来运行!
测试使用select t1.*,t2.* from (select count(*) from demo)t1 ,(select count(*) from demo2) t2;
2.1 严格模式
#严格模式– 通过设置以下参数开启严格模式:
# – (默认为:nonstrict非严格模式)
set hive.mapred.mode=strict;
set hive.mapred.mode=nonstrict;
#严格模式下查询限制:
# 1、对于分区表,必须添加where对于分区字段的条件过滤;
# 2、order by语句必须包含limit输出限制;
# 3、限制执行笛卡尔积的查询。
2.2 并行模式
设置并行后,不相互依赖的任务可以并行计算
#并行计算– 通过设置以下参数开启并行模式:
set hive.exec.parallel=true;
#注意:(一次SQL计算中允许并行执行的job个数的最大值)
set hive.exec.parallel.thread.number
#默认值 8
2.3 Hive排序
- 1. Order By - 对于查询结果做全排序,只允许有一个reduce处理
(当数据量较大时,应慎用。严格模式下,必须结合limit来使用) –
- 2. Sort By - 对于单个reduce的数据进行排序
- 3. Distribute By - 分区排序,经常和Sort By结合使用
- 4. Cluster By - 相当于 Sort By + Distribute By
(Cluster By不能通过asc、desc的方式指定排序规则; 可通过 distribute by column sort by column asc|desc 的方式)
2.4 Hive Join
2.4.1 map join 的两种方式:
1、SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)
SELECT /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value
FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;
2、开启自动的MapJoin;通过修改以下配置启用自动的mapjoin
#该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用
Map join
set hive.auto.convert.join = true;
注意:如果两个方式都设置了,要看设置的参数:
#(默认值:true;是否忽略mapjoin hint 即mapjoin标记)
# true 使用自动方式,false 使用手动方式
hive.ignore.mapjoin.hint;
小表的概念:是在系统中进行设置的设置的是文件发小(默认大概25M)
hive.mapjoin.smalltable.filesize;
2.4.2 Hive join
尽可能使用相同的连接键(会转化为一个MapReduce作业),意思为多表关联的时候尽量使用相同的条件
2.4.2 大表关联大表
- 空key过滤:有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发 送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很 多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。
- 空key转换:有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必 须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据 随机均匀地分不到不同的reducer上(很少)
2.4.5 map-side聚合
2.4.6 合并小文件
合并小文件
文件数目小,容易在文件存储端造成压力,给hdfs造成压力,影响效率 – 设置合并属性
设置合并属性
- 是否合并map输出文件:hive.merge.mapfiles=true
- 是否合并reduce输出文件:hive.merge.mapredfiles=true;
- 合并文件的大小:hive.merge.size.per.task=256*1000*1000
2.4.6 map和reduce数量
2.4.7 JVM重用
适用场景:
- 小文件个数过多
- task个数过多
通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置(n为task插槽个数)
缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,直 到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源