大数据的压缩格式

为什么map端用snappy压缩格式;而reduce用gzip或者bzip2的压缩格式呢?为什么每个reduce端压缩后的数据不要超过一个block的大小呢?      

检查Hadoop版本的压缩格式是否可用【我在Hadoop cdh 5.7版本中查看Hadoop压缩格式】

一、在解答上述问题以前,我们先说一下压缩的优缺点

【优点】

  •   1.减少磁盘存储空间
  •   2.降低IO(其中包括网络IO和磁盘IO)
  •   3.加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度

【缺点】

  1.由于使用数据时需要先解压,就会加重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

                                

【压缩比】

 

从上图可以看出,压缩比越高,压缩速率越慢,压缩时间越长,压缩比:Snappy<LZ4<LZO<GZIP<BZIP2(注意,压缩比的大小不是通过数字的大小来看的,是数字越小,压缩比越大,所以snappy的压缩比是22.2%,数据最大,但是压缩比是最小的)

 三、各自压缩格式的优缺点。

【gzip】

 优点:

  • 1@压缩比在四中压缩方式中较高;
  • 2@hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样,
  • 3@有hadoop native库;
  • 4@大部分linux系统自带gzip命令,使用方便

缺点:

  • 1@不支持split

【lzo】

优点:

  • 1@压缩速率仅次于gzip,解压速率是最快的
  • 2@支持split,是hadoop中最流行的压缩格式;
  • 3@支持hadoop native库
  • 4@需要在linux系统下自行安装lzop命令,使用方便

缺点:

  • 1@压缩比要比gzip低
  • 2@hadoop本身比支持,需要安装;
  • 3@lzo虽然支持split,但是需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要制定inputformat为lzo格式)

【snappy】

优点:

  • 1@压缩速度最快
  • 2@支持hadoop native库

缺点

  • 1@不支持split
  • 2@压缩比最低
  • 3@hadoop本身不支持,需要安装
  • 4@linux系统下没有对应的命令

【bzip2】

优点:

  • 1@支持split
  • 2@压缩比最高,比gzip都高;
  • 3@hadoop本身支持,但不支持native
  • 4@在linux系统下自带bzip2命令,使用方便

缺点:

  • 1@压缩解压速率慢
  • 2@不支持native

【总结】

每一种压缩方式都有他的优缺点,讲求压缩效率,压缩比就会低,占用的网络io和磁盘io就多,讲求压缩比,对cpu的损耗就比较大,同时压缩和解压的耗时就比较多,

对于支持split的(lzo和bzip)可以实现并行处理。

【应用场景】

一般在HDFS 、Hive、HBase中会使用;

当然一般较多的是结合Spark 来一起使用。

现在再让我们回过头来看我们刚刚开始提出的问题

【为什么map端用snappy压缩格式;而reduce用gzip或者bzip2的压缩格式呢?为什么每个reduce端压缩后的数据不要超过一个block的大小呢?】

这个问题可以结合前边老师提出的为什么MR的执行性能不理想来考虑?

当时这个问题的答案是因为每次都要落地到磁盘,

   1、Map压缩主要是增加mr运行的效率,我们就需要找压缩效率最高的压缩格式,snappy的压缩时间最快

    2、Reduce压缩就是输出文件压缩 ,故考虑占用磁盘空间的大小;选择高压缩比gzip或者bzip2;而考虑到会用reduce结果做二次运算;

          则对于选用不支持分割gzip或者bzip2原因有两个:

        (1)是这两个压缩格式高

        (2)对于不可分割我们采用每个reduce端压缩后的数据不要超过一个block的大小的方法;则对于后续的map清洗也就不会出现分割问题。

【压缩在hadoop中的应用】

参考博客:https://my.oschina.net/u/4005872/blog/3030869

原文地址:https://www.cnblogs.com/xuziyu/p/10678135.html