hvie教程hvie的优化
hive在解析sql的时候会默认认为最后一张表是大表,会把其他的表尝试缓存起来,然后扫描最后一个表进行计算,但是用户并不会经常性的将大表放到最后,所以我们可以在sql里面加一个配置,自动去检测并告诉查询优化器哪个是大表
如select /*+streamtable(s)*/a.id from log a left join user b on a.uid=b.uid2.map-side join
set hive.auto.convert.join=true;
如果所有的表中有一张表足够的小,完全将小表缓存在内存中,在最大的表进行mapper的时候,可以和内存中的小表进行逐一匹配,从而省略掉常规连接所需要的reduce的过程用户可以配置和优化小表的大小(单位是字节)
hive.mapjoin.smalltable.filesize=25000000
注意:hive 对于右外连接(right outer join)和全外连接(full outer join)不支持这个优化
3.本地模式
set hive.exec.mode.local.auto=true;(默认为false)
当一个job满足如下条件才能真正使用本地模式:1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2.job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
3.job的reduce数必须为0或者1
一般的简单的查询语句比如:select * from a;这种语句是不会启东mapreduce的。
同样一些简单的查询语句,虽然会启动mr但是也可以使用本地模式
select a.name,a.age from user a;
也可以在hive_home/conf/hive-site.xml中配置
4.并行执行
set hive.exec.parallel=true;
hive在执行的时候,会 将一个查询转换成一个或者多个阶段,这样的阶段可以是多个MapReduce阶段、抽样阶段、
合并阶段、limit 阶段或者hive执行过程中的其他阶段。默认情况下,hive一次只会执行一个阶段。不过,有些特定的
job可能包含众多的阶段,而这些阶段可能并非完全互依赖,可以并行执行,这样可以使整个的执行缩短
也可以在hive_home/conf/hive-site.xml中配置
5.严格模式
set hive.mapred.mode=strict;严格模式
set hive.mapred.mode=nonstrict;非严格模式
hive提供的严格模式,可以防止用户执行那些可能产生意想不到的不好的影响的查询。
第一种:对于分区,除非where的语句中含有分区字段的过滤条件来限制数据范围,否则不允许执行。
第二种:对于使用order by语句的查询,要求必须使用limit的语句。因为order by为了执行排序过程会将
所有的结果数据分发到同一个reduce中进行处理,强制用户增加limit 语句可以防止reducer的额外
执行时间。
第三种:限制笛卡尔积的查询.必须写 on 语句进行关联
6.设置mapper和reducer的个数
set hive.exec.reducers.max=(集群总reduce的槽位个数*1.5)/(执行中的查询的平均个数)
hive的默认的reducer的个数是3
也可以在hive_home/conf/hive-site.xml中配置
7.JVM重用
set mapred.job.reuse.jvm.num.tasks=10
也可以在hadoop的mapred-site.xml中配置
Hadoop的默认配置通常是使用派生JVM来执行map和reduce的任务.这时JVM的启动过程可能会
造成相当大的开销,尤其是执行的job包含成百上千的task任务的情况。JVM重用可以使得JVM实例
在同一个job中重复使用N次,有个缺点,开启JVM重用会一直占用task的插槽,直到任务结束才会释放
8.hive动态分区
参考地址https://blog.csdn.net/oracle8090/article/details/72627135
9.set hive.map.aggr=true;
相当于 map端的 combiner操作
10.join优化(当操作的时候数据有大部分为null就会出现倾斜)
set hive.optimize.skewjoin=true;
如果是join过程中出现数据倾斜应该设置为true,变成自动优化
set hive.skewjoin,key=10000;
当join的建对应的记录条数超过这个值则会进行优化
11. group by 优化
hive.groupy.skewindata=true;
如果是group by 过程中出现出具倾斜应该设置为true
set hive.groupby.mapaggr.checkinterval=100000;
当group的键对应的记录条数超过这个值则会进行优化
hive 配置信息https://blog.csdn.net/chaoping315/article/details/8500407