0.概述
Hive的一般学习者谈性能调优的时候一般都会从语法和参数的角度来谈优化,而不会革命性的优化Hive的性能。
Hive的核心性能问题往往是在超大规模数据集,例如100亿条级别的数据集,以及每天处理上千上万个Hive作业的情况下产生的。
要从根本上解决实际企业中Hive真正的性能优化问题,必须考虑到底什么是Hive性能的限制,按照级别来说:
- 第一重要的是:战略性架构
解决海量数据大量job过于频繁的IO问题,而这个问题实质上涉及了架构方面的分表,数据复用以及分区表等调优方式; - 第二重要的是:引擎和物理层面
从Hive语法和job内部的角度去进行优化; - 一些关键的参数
归根到底,Hive的性能调优主要考虑的是如何最大化和最有效地使用CPU、内存和IO。
1. 压缩技术
Hive压缩一般采用Snappy、LZO和GZIP。最常用的是Snappy,因为它比较快。
可以通过两种方式来使用压缩。
一种是设置Hadoop的参数,在core-site.xml文件中。
<property>
<name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec</value>
</property>
主要是这个参数 org.apache.hadoop.io.compression.SnappyCodec,使用Snappy来压缩,这样设置凡是在Hadoop上运行的框架也会使用Snappy来压缩。
另一种是单独设置Hive的压缩
set hive.exec.compress.intermediate=true;
set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
2.缓存技术
提交作业的时候总会把jar提交到集群中,如果一些jar常用到就会反复提交,这时可以通过缓存的技术把这些常用的东西放到缓存的文件夹中,这样就不用每次都提交了。
跟上面一样也有两种方式,一种是通过Hadoop设置,一种是通过Hive设置。
Hadoop设置:
DistributedCache 是Map/Reduce框架提供的功能,能够缓存应用程序所需的文件 (包括文本,档案文件,jar文件等)。分布式缓存(distributed cache)的机制来将数据分发到集群上的所有节点上。
操作步骤:
1.将数据分发到每个节点上:
DistributedCache.addCacheFile(new Path(args[0]).toUri(), conf);
2.在每个mapper上使用DistributedCache.getLocalCacheFiles()来获取文件,之后再进行相应的操作:
DistributedCache.getLocalCacheFiles();
可参考:http://hpuxtbjvip0.blog.163.com/blog/static/3674131320132794940734/
Hive设置:
hive-site.xml文件中:
hive.aux.jars.path
file:///usr/local/hive/lib/hive-hbase-handler-0.13.1.jar,file:///usr/local/hive/lib/protobuf-java-2.5.0.jar,file:///us
r/local/hive/lib/hbase-client-0.96.0-hadoop2.jar,file:///usr/local/hive/lib/hbase-common-0.96.0-hadoop2.jar,file:///usr/local
/hive/lib/zookeeper-3.4.5.jar,file:///usr/local/hive/lib/guava-11.0.2.jar