参考书籍:《Hive编程指南》
1.Hive压缩
压缩能节约磁盘空间,还能增加吞吐量和性能。但是压缩/解压会增加额外的CPU开销,不过,通过减少载入内存的数据量而提高I/O吞吐量会更加提高网络传输性能。
Hadoop的job通常是I/O密集型而不是CPU密集型的。如果是这样的话,压缩可以提高性能。不过如果用户的job是CPU密集型的话,那么使用压缩可能会降低执行性能。确定是否进行压缩的唯一方法就是尝试不同的选择,并测量对比执行结果。
2.常见压缩格式的性能
压缩方式 | 压缩率 | 压缩/解压速度 | 是否可分割 |
Gzip | 中 | 中 | 否 |
BZip2 | 高 | 慢 | 是 |
Snappy | 低 | 快 | 否 |
LZO | 低 | 快 | 是 |
Zlib | 低 | 快 | 是 |
分析:
BZip2压缩率最高,但是需要消耗最多的CPU,且压缩/解压速度慢。
GZip是压缩率和压缩/解压速度都是中等。
LZO和Snappy压缩率相比前面两个要小,但是压缩和解压很快。
3.Hive常用的压缩参数
(1)查看Hive支持的压缩算法
set io.compression.codecs;
结果:
io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec
(2)开启中间压缩
对中间数据进行压缩可以减少job中map和reduce task的数据传输量。对于中间数据压缩,选择一个低CPU开销的编/解码器要比选择一个压缩率高的编/解码器要重要,用户可以在查询语句或者脚本中设置这个值
set hive.exec.compression.intermediate=true;
开启中间压缩建议配合Snappy压缩
Snappy结合了低CPU开销和好的压缩执行效率,适合中间文件的压缩和解压
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
提示:
对于其他的Hadoop job(MapReduce等)来说控制中间数据压缩的参数是mapred.compress.map.output.
(3)最终输出结果压缩
当Hive将输入写入到表中时,设置下列参数使输出内容压缩。用户可以在查询语句或者脚本中设置这个值
set hive.exec.compress.output=true;
提示:
对于其他的Hadoop job(MapReduce等)来说控制最终输出结果压缩功能的参数是mapred.output.compress
(4)Gzip压缩测试
# 创建测试表
create table inventory_compress(
inv_date_sk int,
inv_item_sk int,
inv_warehouse_sk int,
inv_quantity_on_hand int
)
row format delimited fields terminated by '|'
stored as textfile;
# 开启压缩
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set hive.exec.compress.output=true;
# 开启压缩之后,使用insert进行数据导入(inventory为测试表已经存在)
insert overwrite table inventory_compress
select * from inventory;
# 查看压缩之后的数据
hdfs dfs -ls /warehouse/tablespace/managed/hive/testdb/inventory_compress/base_0000001
结果:
/warehouse/tablespace/managed/hive/test.db/inventory_compress/base_0000001/000000_0.gz
文件已经是压缩成功了。
4.压缩调优总结
(1)如果磁盘空间利用率和I/O开销优先级高的话,选择BZip2和GZip。
(2)频繁读取数据所需的解压缩速度优先级高的话,选择LZO和Snappy。
(3)中间数据多的时候,选择开启中间数据压缩,压缩格式选择Snappy。