①join连接时的优化:当三个或更多的表进行join连接时,如果每个on使用相同的字段连接时只会产生一个MapReduce job。
②join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。 原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算。
tips: 用户并非总是要将最大的表放置在查询语句最后面,因为Hive提供了一个“标记”机制来显式地告知查询优化器哪张表是大表。
/*+STREAMTABLE(tablename)*/
③在where字句中增加分区过滤器。
④当可以使用
left semi join
语法时不要使用
inner join
前者效率更高。
原因:对于左表中指定的一条记录,一旦在右表中找到匹配的记录,Hive立即停止扫描。
tips: LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
⑤如果所有表中有一张表足够小,则可置于内存中,Hive可以在map端执行连接过程(map-side JOIN),这是因为Hive可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程。 设置属性即可实现:
set hive.auto.covert.join=true;
用户可以配置希望被优化的小表的大小
set hive.mapjoin.smalltable.size=2500000;
如果需要使用这两个配置可置入$HOME/.hiverc文件中。
Hive对于右外连接和全外连接不支持这个优化。
⑥同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次。 例如:
insert overwrite table student select from employee; insert overwrite table person select from employee;
可以优化成:
from employee insert overwrite table student select insert overwrite table person select
⑦limit调优:limit语句通常是执行整个语句后返回部分结果。
set hive.limit.optimize.enable=true;
⑧开启并发执行。 某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成。设置属性:
set hive.exec.parallel=true;
⑨hive提供的严格模式,禁止3种情况下的查询。
a:当表为分区表时,where子句后没有分区字段和限制时,不允许执行。
b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。
c:限制笛卡尔积的查询。
⑩合理的设置map和reduce数量。
11:JVM重用。可在hadoop的mapred-site.xml中设置JVM被重用的次数。
12:使用explain和explain extended学习Hive是如何将查询转化为MapReduce任务的。
网友评论