为什么使用压缩
使用压缩可以减小所需的磁盘空间,减小磁盘和网络的IO操作,减小了载入内存的数据量提高了IO吞吐量,提升了网络性能(因为MapReduce大多是文件读写操作,属于IO密集型)。
几种不同的压缩方案
如果磁盘利用率和IO开销都需要考虑的话,可以选择以下两种
BZip2
压缩率最高,同时需要消耗最多的CPU开销。
GZip
压缩率 / 压缩、解压速度的最佳选择
LZO 和 Snappy
压缩率不及上面的两种,但是压缩和解压的速度更快,特别是在解压过程。
如果需要频繁读取数据进行解压缩,可以使用LZO或者Snappy。
此外,需要注意的一点是GZip和Snappy的压缩文件不可划分。即MapReduce无法将输入的文件划分为多个部分,如果文件特别大,就需要一个单独task来进行处理。
中间压缩
开启中间压缩可以减少map和reduce之间的数据传输量。
对于中间压缩,低CPU开销比最终的压缩效率更为重要。
set hive.exec.compress.intermediate = true // 开启中间压缩,默认为false
sequence file存储格式
sequence file是含有键值对的二进制文件。
对于不可分割的压缩文件,最严重的的缺点就是只能从头读到尾,无法由多个mapper并行执行。
而sequence file存储格式可以将一个文件分为多块,然后采取可分割的方式对块进行压缩。
创建表时可以直接指定sequence file格式:
CREATE TABLE tmp
(
user_id STRING
)
STORED AS SEQUENCEFILE
sequence file提供了三种压缩方式:NONE, RECORD, BLOCK 。
默认为RECORD级,不过通常来说BLOCK级压缩性能最好。