hive常用的调优方案
Fetch抓取(走集群,不走MR)
-
Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算
- 例如:select * from score;
- 在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台
-
在hive-default.xml.template文件中 hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。
示例
-
把 hive.fetch.task.conversion设置成**none**,然后执行查询语句,都会执行mapreduce程序
set hive.fetch.task.conversion=none; select * from score; select s_id from score; select s_id from score limit 3;
-
把hive.fetch.task.conversion设置成==more==,然后执行查询语句,如下查询方式都不会执行mapreduce程序。
set hive.fetch.task.conversion=more; select * from score; select s_id from score; select s_id from score limit 3;
本地模式
-
在Hive客户端测试时,默认情况下是启用hadoop的job模式,把任务提交到集群中运行,这样会导致计算非常缓慢;
-
Hive可以通过本地模式在单台机器上处理任务。对于小数据集,执行时间可以明显被缩短。
示例
--开启本地模式,并执行查询语句
set hive.exec.mode.local.auto=true; //开启本地mr
--设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,
--默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=50000000;
--设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,
--默认为4
set hive.exec.mode.local.auto.input.files.max=5;
--执行查询的sql语句
select * from student cluster by s_id;
--关闭本地运行模式
set hive.exec.mode.local.auto=false;
select * from student cluster by s_id;
表的优化
join调优
参考之前的:join的优化
group by调优
参考之前的:group by 优化
count调优
通过增加一个Job的方式调高效率,数据量大是划算。
- 数据量小的时候无所谓,数据量大的情况下,由于count distinct 操作需要用一个
reduce Task
来完成,这一个Reduce
需要处理的数据量太大,就会导致整个Job很难完成, - 一般count distinct使用先group by 再count的方式替换
# 每个reduce任务处理的数据量 默认256000000(256M)
set hive.exec.reducers.bytes.per.reducer=32123456;