今天总结一下有关hive的性能调优,一下测试在本地环境,单节点模式(非高可用)进行测试,影响因素也可能和个人电脑配置有关,但是经过一系列配置,性能还是提升了不少。
关于hive调优,首先要对hive运行原理有了解。通晓原理,从根本进行调优。
hive的基本运行原理:HQL——> Job——> Map/Reduce。
通过以上基本原理,我们可以从以下三个方面进行调优,HQL语句调优,job任务调优,map/reduce阶段调优。重点说一下job和map/reduce优化。
1 JOB优化:
1.1 并行化执行
每个查询被Hive转化为多个阶段,有些阶段关联性不大,则可以并行化执行,减少执行时间
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
1.2 本地化执行
set hive.exec.mode.local.auto=true;
当一个join满足如下条件才能真正使用本地模式:
Job的输入数据大小必须小于参数
hive.exec.mode.local.auto.inputbytes.max(默认128MB)
Job的map数必须小于参数
hive.exec.mode.local.auto.tasks.max(默认4)
Job的reduce数必须为0或者1
1.3 job合并输入小文件
因为hive其实底层执行的是mapreduce程序,所以减少输入小文件可以提升性能。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
1.4 job合并输出小文件
有点像map阶段完成后,向reduce阶段输入时使用combine,从而合并小文件向reduce输入
set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动新job合并文件
set hive.merge.size.per.task=64000000;合并之后的文件大小
2 hive Map端优化
2.1 map聚合
set hive.map.aggr=true;(效果显著)
2.2 推测执行
mapred.map.tasks.speculative.execution
2.3 Map端的shuffle优化
io.sort.mb
io.sort.spill.percent
min.num.spill.for.combine
io.sort.factor
io.sort.record.percent
2.4 reduce端的shuffle优化。
mapred.reduce.parallel.copies
mapred.reduce.copy.backoff
io.sort.factor
mapred.job.shuffle.input.buffer.percent
mapred.job.reduce.input.buffer.percent
当然,还有其他优化方式,例如Fetch抓取
1)理论分析
Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。
在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。
可以在配置文件中进行配置,也可以进行set设置
(1)把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行mapreduce程序。
hive (default)> set hive.fetch.task.conversion=none;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
(2)把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行mapreduce程序。
hive (default)> set hive.fetch.task.conversion=more;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
以下附上两张图(调优前后对比)
调优前:
调优后:
下一节讲hql调优以及表的优化。