本文转载自:点击打开链接
hive常见优化方法总结
1,使用关键字 EXPLAIN 或者 EXPLAIN EXRENDED ,在要执行的sql语句前面加关键字,不执行语句,可以用来查看语法树
2,使用limit限制的调整,一般使用limit其实还是全表扫描,所以可以修改配置
3,在数据量少的情况下可以使用本地模式查询
set oldjobtracker=${hiveconf:mapred.job.tracker}
set mapred.job.tracker=local;
set mapred.tmp.dir=/home/edward/tmp;
select * from people where firstname=bob;
设置属性 hive.exec.model.local.auto 的值为true
4,join优化
将最大的表放在join语句的最右边,或者直接使用/*streamtable(table_name)*/语句指出
如果所有表中有一个表足够的小,可以完整的载入到内存中,那么这时hive可以执行一个map-side JOIN,
这样可以减少reduce过程
5,严格模式
使用hive.mapred.mode 的值为strict 禁止3中类型查询
其一:对于分区表,除非where语句中含有分区字段过滤条件来限制数据范围,否则不允许执行。
其二:对于order by的语句查询,必须使用limit语句,因为order by为了值执行排序过程会将所有的结果数据分发到同一个reduce中进行处理,强制要求用户增加这个limit语句可以防止reducer额外执行很长一段时间
其三:限制笛卡尔积的查询。在join时使用on,避免使用where
6,并行执行
通过设置参数hive.exec.parallel的值为true,就可以开启并发执行,不过,在共享集群中,需要注意下,如果job中
并行执行的阶段增多,那么集群的利用率就会增加
7,调整mapper和reducer个数
hive的默认reducer个数是3个,可以通过mapred.reduce.tasks的值为不同的值来确定是使用较多还是较少的reducer来缩短执行时间。当在共享集群上处理大任务时,为了控制资源利用情况,属性hive.exec.reducers.max显得非常重要。一个hadoop可以提供的map和reduce资源个数(“插槽”),是固定的。通过设置hive.exec.reducers.max可以阻止某个查询消耗太多的资源。对于之歌属性值的计算公式如下
(集群总Reduce槽位个数*1.5)/(执行中的查询的平均个数)