Hive的优化方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanxingbudui/article/details/82185163

1、join连接时的优化:当超过2个表进行join关联操作时,如果 on 后面 JOIN 的 key 相同,不管有多少个表,都会则会合并为一个 Map-Reduce。

INSERT OVERWRITE TABLE test_users 
SELECT 
    t.pageid,
    u.age 
FROM test_view t 
JOIN user u ON (t.userid = u.userid) 
JOIN newuser x ON (t.userid = x.userid);
--只生成一个MapReduce

2、join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算。如果所有表中有一张表足够小,则可置于内存中,这样在和其他表进行连接的时候就能完成匹配,省略掉reduce过程。设置属性即可实现,set hive.auto.covert.join=true; 用户可以配置希望被优化的小表的大小 set hive.mapjoin.smalltable.size=2500000; 如果需要使用这两个配置可置入$HOME/.hiverc文件中。
3、在where子句中增加分区过滤器。
4、当可以使用LEFT SEMI JOIN 语法时不要使用INNER JOIN语法,前者效率更高。原因:对于左表中指定的一条记录,一旦在右表中找到立即停止扫描。用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录;当子表中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合。
5、同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次。
例如: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 *
6、limit调优:limit语句通常是执行整个语句后返回部分结果。set hive.limit.optimize.enable=true;
7、开启并发执行。某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成。设置属性:set hive.exec.parallel=true;
8、hive提供的严格模式,禁止3种情况下的查询模式。
a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行。
b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。
c:限制笛卡尔积的查询。
9、合理的设置map和reduce数量。
10、jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数。

猜你喜欢

转载自blog.csdn.net/lanxingbudui/article/details/82185163