本文主要参考文献:
- 《Hive编程指南》
- 数据分析利器之hive优化十大原则
- 优化一:hive.auto.convert.join
1. limit 调整以语句快速出结果
很多情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果。有一个配置属性可以开启,用于对数据源进行抽样,从而避免执行整个查询语句。
- hive.limit.optimize.enable=true --- 开启对数据源进行采样的功能
- hive.limit.row.max.size --- 设置最小的采样容量
- hive.limit.optimize.limit.file --- 设置最大的采样样本数
缺点:有可能部分数据永远不会被处理到
2. Join优化
(1)使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
(2)使得表从小到大join 或者 用语句标记最大表
- Hive假定查询中最后的一个表是大表。在对每行Join时它会将其它表缓存起来,然后扫描最后那个表进行计算。因此需要保证连接查询中的表的大小是从左到右依次增加的。
- 或者直接标记最大表:/*streamtable(table_name) */
(3)若有小表可以载入内存,可以执行map-side Join
如果所有表中只有一张表是小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行连接过程(称为map-side JOIN),因为Hive可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程。
- Hive v0.7版本之前:/*+ MAPJOIN(table_name) */
- Hive v0.7版本及之后:
--(废弃了以上标记方式,但以上标记方式仍然有效。 )
--是否自动转换为mapjoin
hive.auto.convert.JOIN=true
--小表的最大文件大小,默认为25000000,即25M
set hive.mapjoin.smalltable.filesize = 25000000;
--是否将多个mapjoin合并为一个
set hive.auto.convert.join.noconditionaltask = true;
--多个mapjoin转换为1个时,所有小表的文件大小总和的最大值。
set hive.auto.convert.join.noconditionaltask.size = 10000000;
(4)尽量尽早地过滤数据
减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。
3. 本地模式