压缩的好处:1,就是节省磁盘空间,提升磁盘利用率。2,加速网络的传输。
压缩的缺点:1,需要占用cpu资源进行压缩与解压。2,压缩与解压需要时间。
压缩比和压缩速度是相反的。
压缩速度从高到低:
Snappy>LZ4>LZO>gzip>bzip2
LZO:通过索引可切分。
bzip2:可切分。
gzip,LZ4,Snappy其他均不可切分。
Snappy,LZ4,LZO针对压缩速度优化
什么是不可切分?
压缩数据只能用一个MAP处理,运行的时间可能会更长。
详解:
gzip格式的数据,不支持切分的真正含义,并不是说HDFS不会将文件分布式的存储在各个节点,
gzip格式使用DEFLATE算法来存储压缩后的数据,而DEFLATE算法将数据存储在一系列连续的压缩块中。
问题在于每个块的起始位置并没有以任何形式标记,
所以读取时无法从数据流的任意当前位置前进到下一块的起始位置读取下一个数据块,
从而实现与整个数据流的同步。也就是仅有一个map,这样的效率是及其低下的。
map任务数量越少,作业的粒度就越大,因而运行的时间可能会更长。
一个map任务处理N个HDFS块,而其中大多数块并没有存储在执行该map任务的节点上,执行的效率会非常低
可切分压缩格式尤其适合MapReduce。
建议:
1,使用容器文件格式,例如顺序文件(Sequence File)、Avro数据文件、ORCFile或者Parquet文件,
所有这些文件格式同时支持压缩和切分。通常与一个快速压缩工具联合使用,例如,LZO、LZ4或者Snappy,
2,使用支持切分的压缩格式,例如bzip2(尽管bzip2非常慢),或者使用通过索引实现切分的压缩格式,例如LZO
3,在应用中将文件切分成块,并使用任意一种压缩格式为每个数据块建立压缩文件(不论它是否支持切分)。
这种情况下,需要合理选择数据块大小,以确保压缩后的数据块的大小近似于HDFS块的大小,
4,存储未经压缩的文件



