这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
数据压缩算法
大数据领域常见的压缩格式有 gzip,snappy,lzo,lz4,bzip2,zstd。
为什么要进行数据压缩?
为了优化存储(减少存储空间)和充分利用网络带宽,通常采用压缩方法。大数据需要处理海量数据,此时数据压缩非常重要。
在企业中存在的许多场景中,通常,数据源来自多种文本格式(CSV、TSV、XML、JSON等)数据。这些文件是人类可读的,但占用了大量的存储空间。
然而在大数据处理中数据应尽可能为机器可读。使用序列化的压缩技术将这些人类可读的数据压缩成机器可读的, 可确保存储所需的空间大大减少。
以下是一些众所周知的常用压缩格式(称为编解码器,允许数据压缩/序列化和解压缩/反序列化)
Gzip(扩展名为.gz)
即 GNU Zip(GZip),一种众所周知的压缩格式,并且在互联网世界中被广泛使用。可以使用此格式压缩请求和响应,以有效利用网站/Web应用程序的带宽。
优点
压缩比较高,hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样,有hadoop native库,大部分linux系统都自带gzip命令,使用方便。
缺点
不支持split
hadoop native 是什么? 鉴于性能问题以及某些Java类库的缺失,对于某些组件,Hadoop提供了自己的本地实现。 这些组件保存在Hadoop的一个独立的动态链接的库里。这个库在Unix平台上叫libhadoop.so.
Snappy(扩展名为.snappy)
由 Google开发的编解码器(以前称作Zippy),被认为是中等压缩比中性能最好的。对于该格式而言,性能比压缩比更为重要。Snappy属于最为广泛使用的格式之一,显然是由于其出色的性能。
优点
压缩速度快;支持hadoop native库
缺点
不支持split;压缩比低;hadoop本身不支持,需要安装;linux系统下没有对应的命令
LZO(扩展名为.lzo)
由GNU公共许可证(GPL)授权,与 Snappy非常类似,它具有中等压缩比,而压缩与解压缩性能很高。LZO是一种专注于解压缩速度的无损数据压缩算法。
优点
压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;需要在linux系统下自行安装lzop命令,使用方便
缺点
hadoop本身不支持,需要安装;lzo虽然支持split,但需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要指定InputFormat为lzo格式)。
LZ4(扩展名.lz4)
优点
性能好压缩比高,首次初始化速度较好,压缩速度和稳定性也都不错
缺点
- lz4的解压比较麻烦,需要指定原byte数组大小,所以开发起来工作量要大些
- 不支持split
Bzip2(扩展名.bz2)
或多或少与GZip类似,压缩比高于GZip。但如预期一样, Bzip2的数据解压缩速度比GZip慢。其中一个重要的方面是,它支持数据分割,这在使用HDFS作为存储时非常重要。如果数据只是被存储而无须查询,那么这种压缩将是一个不错的选择。
优点:
支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便
缺点:
压缩/解压速度慢;不支持native
zstd(扩展名.zstd)
zstd是Facebook在2016年开源的新无损压缩算法,优点是压缩率和压缩/解压缩性能都很突出。zstd还有一个特别的功能,支持以训练方式生成字典文件,相比传统压缩方式能大大的提高小数据包的压缩率。
- 对大数据量的文本压缩场景,zstd是综合考虑压缩率和压缩性能最优的选择,其次是lz4。
- 对小数据量的压缩场景,如果能使用zstd的字典方式,压缩效果更为突出。
- 支持split, 但是还不完善,详情可见——Is zstd splitabble in hadoop/spark/etc?
数据的压缩说明
压缩模式评价
- 可使用以下三种标准对压缩方式进行评价
- 压缩比:压缩比越高,压缩后文件越小,所以压缩比越高越好
- 压缩时间:越快越好
- 已经压缩的格式文件是否可以再分割:可以分割的格式允许单一文件由多个 Mapper 程序处理,可以更好的并行化
常见压缩格式
对比
压缩方式 | 压缩比 | 压缩速度 | 解压缩速度 | 是否可分割 |
---|---|---|---|---|
gzip | 13.4% | 21 MB/s | 118 MB/s | 否 |
bzip2 | 13.2% | 2.4MB/s | 9.5MB/s | 是 |
lzo | 20.5% | 135 MB/s | 410 MB/s | 是 |
snappy | 22.2% | 172 MB/s | 409 MB/s | 否 |
Hadoop编码/解码器方式
压缩格式 | 对应的编码/解码器 |
---|---|
DEFLATE | org.apache.hadoop.io.compress.DefaultCodec |
Gzip | org.apache.hadoop.io.compress.GzipCodec |
BZip2 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | com.hadoop.compress.lzo.LzopCodec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
数据压缩使用
Hive表中间数据压缩
#设置为true为激活中间数据压缩功能,默认是false,没有开启
set hive.exec.compress.intermediate=true;
#设置中间数据的压缩算法
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;
Hive表最终输出结果压缩
set hive.exec.compress.output=true;
set mapred.output.compression.codec=
org.apache.hadoop.io.compress.SnappyCodec;