前言
我们都知道Hive默认的执行引擎是MR,在没有对Hive执行引擎改造之前(如HDP的TEZ,Hive on Spark项目),我们对Hive的调优依然只能围绕Hive本身支持的如存储格式,压缩,参数,SQL语句等方面的优化做出考虑。
存储与压缩
关于Hive存储格式和压缩方式的选择和使用,这里就不再做介绍,请参考以前博客存储格式和压缩方式
Hive 调优参数
因为Hive的默认执行引擎为MR,所以基于Hive的参数调优,主要还是MR的参数调优以及Hive客户端的一些设置
1.开启Hive map阶段及reduce压缩参数:
在MR中使用压缩需要从输入,中间,输出三个阶段去选择不同的压缩方式,输入阶段可能更看重的是数据是否支持split,支持split可以增加Map输入个数而增加计算并行度,如选择可分割的Bzip2和Lzo(Lzo压缩格式要建立索引),中间map输出要考虑下阶段reduce输入带来的压缩与解压CPU时间开销,如选择压缩解压速率较快的Snappy,最终输出如果不作为其他依赖任务的输入,更加考虑的是磁盘存储上的开销,如选择高压缩比的Bzip2
开启map阶段使用压缩参数:
set hive.exec.compress.intermediate=true
set mapred.map.output.compression=true
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec
开启reduce最终输出使用压缩参数:
set hive.exec.compress.output=true
set mapred.output.compression=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
set mapred.output.compression.type=BLOCK
2.设置Map与Reduce个数增加并行:
Map输入个数是根据split size大小来划分,默认是一个block块一个map,若单个文件小于一个block大小,那个也会作为一个map输入,MapReduce计算split size 大小是由computeSplitSize函数算出:
protected long computeSplitSize(long blockSize, long minSize,
long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize));
}
可以看出,当最大值设置大于一个块大小时&