前言
在Hive作业执行过程中,job执行速度更多的是局限于I/O,而不是受制于CPU。如果是这样,通过文件压缩可以提高作业性能。然而,如果作业的执行速度受限于CPU的性能,那么压缩文件可能就不合适,因为文件的压缩和解压会比较耗时。当然确定适合集群最优压缩方式可以通过实验测试,然后衡量结果。
Map/Reduce输出压缩
在查询分析过程中,Map/Reduce的输出可以对任务输出进行压缩,既可以减少文件存储空间,又可以减少网络传输的数据量,加快数据在网络不同节点之间的传输速度,从而获得性能提升。
压缩设置如下:
set hive.exec.compress.output=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set mapred.output.compression.type=BLOCK;
Map-Reduce作业中间压缩
Hive的多个Map-Reduce作业之间生成的中间File是否可以被压缩呢?答案是肯定的!
压缩设置如下:
set hive.exec.compress.intermediate=true; set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;(常用) set hive.intermediate.compression.type=BLOCK;
压缩格式
Hive中我们可以选择的压缩格式有:
- GZip
- BZip2
- Snappy
- LZO
GZip 和 BZip2压缩具有较高的压缩比保证压缩文件最小,但是压缩和解压缩过于耗时。这两种方式具有很好的压缩效果,减少I/O,比较适合最终的输出结果压缩的场景。
Snappy和LZO压缩和解压缩速度很快,但是压缩比较低,压缩文件较大。这两种方式对CPU的消耗较低,对于Map-Reduce作业中间压缩的场景是比较的压缩方式。
注意:BZip2 和 LZO支持压缩文件分割,而GZip 和 Snappy不支持。
序列化文件的压缩
序列化文件支持三种不同的压缩方式:
- NONE :表示不压缩
- RECORD :表示按行压缩
- BLOCK. :表示按块压缩
RECORD是默认值;BLOCK压缩方式比较有效,同时可以支持文件分割。