数据压缩

优点:减少磁盘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输出端压缩

compress-position.jpg

压缩参数配置

为了支持多种压缩/解压格式,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. // 也可以通过FileOutputFormat工具进行配置,(实际上也是对configuration对象添加了配置项)
  6. // 设置reduce端输出压缩开启
  7. FileOutputFormat.setCompressOutput(job, true);
  8. // 设置压缩的方式
  9. FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);