数据压缩

优点:减少磁盘IO、减少占用的磁盘存储空间
缺点:增加CPU开销
原则:

  • 对于IO密集型 job(网络传输) ,可以多用压缩
  • 对于运算密集型的 job,少用压缩

    压缩编码

    压缩算法对比:
压缩格式 Hadoop自带 算法 文件扩展名 是否可切片 转成压缩后,是否需要修改原始程序
DEFLATE 是,可以直接使用 DEFLATE .deflate 和文本处理一样,不需要修改程序
Gzip 是,可以直接使用 DEFLATE .gz 和文本处理一样,不需要修改程序
bzip2 是,可以直接使用 bzip2 .bz2 和文本处理一样,不需要修改程序
LZO 否,需要安装 LZO .lzo 需要建索引,还需要指定输入格式
Snappy 是,可以直接使用 Snappy .snappy 和文本处理一样,不需要修改程序

LZO的压缩率不如Gzip、biz2,但是压缩速度、解压速度非常快。支持split切片,但是切片需要额外创建索引。

Gzip压缩率 比较高,压缩/解压速度一般般。

bzip2压缩率非常高,可以将一个大文件压缩成一个很小的文件,但是压缩速度、解压速度非常缓慢。支持split切片

Snappy设计的目的也不是为了高压缩率,而是为了非常快的速度和合理的压缩。在 64位i7 处理器环境,snappy的压缩速度可以达到每秒250Mb,解压速度每秒500Mb。

Snappy是谷歌开源的,在谷歌内部被广泛用于 BigTable、MapReduce等内部 RPC 系统。

压缩位置

压缩可以在MapReduce作用的任意阶段启动,一般分为:

  • 输入端压缩
  • Mapper输出端压缩
  • Reducer输出端压缩

image.png

压缩参数配置

为了支持多种压缩/解压格式,Hadoop引入了编码/解码器:

压缩格式 对应的编码/解码器
deflate org.apache.hadoop.io.compress.DefaultCodec
或者:org.apache.hadoop.io.compress.DeflateCodec
gzip org.apache.hadoop.io.compress.GzipCodec
bzip2 org.apache.hadoop.io.compress.BZip2Codec
LZ4 org.apache.hadoop.io.compress.Lz4Codec
zstd org.apache.hadoop.io.compress.ZStandardCodec
LZO com.hadoop.compression.lzo.LzopCodec

开启压缩需要配置相关的参数:

配置文件 参数 默认值 压缩阶段 建议
core-site.xml io.compression.codecs 无 需要使用命令hadoop checknative
查看支持的本地库压缩方式
输入阶段 Hadoop使用文件扩展名判断是否支110持某种编码/解码器
mapred-site.xml mapreduce.map.output.compress false mapper
输出
这个参数设置为true
启动压缩
mapred-site.xml mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.DefaultCodec mapper
输出
企业中多使用 LZO 或者 Snappy 编码/解码器在此阶段压缩数据
mapred-site.xml mapreduce.output.fileoutputformat.compress false reducer
输出
这个参数设置为true
启用压缩
mapred-site.xml mapreduce.output.fileoutputformat.compress.codec org.apache.hadoop.io.compress.DefaultCodec reducer
输出
使用标准工具或者编码/解码器,例如gzip/biz2

也可以在 Java 程序中,对某个MapReduce开启压缩:(即:不在xml中配置,而是在configuration对象中添加配置信息)

  1. // 开启mappper端输出压缩
  2. configuration.setBoolean("mapreduce.map.output.compress", true);
  3. // 设置mappper输出的压缩方式
  4. configuration.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);
  5. ------------------------------------------------------------------------------------------------
  6. // 也可以通过FileOutputFormat工具进行配置,(实际上也是对configuration对象添加了配置项)
  7. // 设置reduce端输出压缩开启
  8. FileOutputFormat.setCompressOutput(job, true);
  9. // 设置压缩的方式
  10. FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);