一、使用压缩的优缺点
优点
- 减少磁盘存储时间
- 降低网络IO以及磁盘IO
- 加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度
缺点
- 使用数据时由于要先解压,加重CPU负荷
二、压缩的格式
压缩格式 | 工具 | 算法 | 扩展名 | 是否支持分割 | Hadoop编码/解码 |
---|---|---|---|---|---|
DEFLATE | N/A | DEFLATE | .deflate | No | org.apache.hadoop.io.compress.DefalutCodec |
gzip | gzip | DEFLATE | .gz | No | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | bzip2 | bzip2 | .bz2 | Yes | org.apache.hadoop.io.compress.Bzip2Codec |
LZO | Lzop | LZO | .lzo | Yes(if index) | com.hadoop.compression.lzo.LzoCodec |
LZ4 | N/A | LZ4 | .lz4 | No | org.apache.hadoop.io.compress.Lz4Codec |
snappy | N/A | snappy | .snappy | No | org.apache.hadoop.io.compress.SnappyCodec |
各种压缩方式的对比
- gzip
优点:
– 压缩比在四种压缩方式中较高;
– hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;
– 有hadoop native库;
– 大部分linux系统都自带gzip命令,使用方便
缺点:
– 不支持split - lzo
优点:
– 压缩/解压速度也比较快,合理的压缩率;
– 支持split,是hadoop中最流行的压缩格式;
– 支持hadoop native库;
– 需要在linux系统下自行安装lzop命令,使用方便
缺点:
– 压缩率比gzip要低;
– hadoop本身不支持,需要安装;
– lzo虽然支持split,但需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要指定inputformat为lzo格式) - snappy
优点:
– 压缩速度快;
– 支持hadoop native库
缺点:
– 不支持split;
– 压缩比低;
– hadoop本身不支持,需要安装;
– linux系统下没有对应的命令 - bzip2
优点:
– 支持split;
– 具有很高的压缩率,比gzip压缩率都高;
– hadoop本身支持,但不支持native;
– 在linux系统下自带bzip2命令,使用方便
缺点:
– 压缩/解压速度慢;
– 不支持native
【总结】
- 每一种压缩方式都有他的优缺点,讲求压缩效率,压缩比就会低,占用的网络和磁盘IO就多,讲求压缩比,对cpu的损耗就比较大,同时压缩和解压缩的耗时就比较多
- 对于支持split的(LZO 、bzip)可以实现并行处理
- 压缩比越高,压缩速率越慢,压缩时间越长,压缩比:Snappy<LZ4<LZO<GZIP<BZIP2
【应用场景】
- 一般在HDFS 、Hive 、 HBase中使用,一般结合Spark来一起使用
三、问题
- 为什么map端用snappy压缩格式
因为使用压缩的目的是提高MR执行的效率,所以我们需要找压缩效率最高的压缩格式,snappy的压缩时间最快。 - 为什么Reduce端使用gzip或者bzip的压缩格式
Reduce压缩则是对应输出文件压缩,故考虑占用磁盘空间的大小;选择高压缩比的gzip或者bzip2;由于gzip不支持分割,那么可以采用每个reduce端压缩输出的数据不要超过一个block的大小,