Skip to content

Hadoop数据压缩

1. 概述

  1. 压缩的好处和坏处
    优点:以减少磁盘IO、减少磁盘存储空间。
    缺点:增加CPU开销。
  2. 压缩原则
    密集型的Job,少用压缩
    集型的Job,多用压缩

2. MR支持的压缩编码

2.1 压缩算法对比介绍

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

2.2 压缩性能的比较

压缩算法原始文件大小压缩文件大小压缩速度解压速度
gzip8.3GB1.8GB17.5MB/s58MB/s
bzip28.3GB1.1GB2.4MB/s9.5MB/s
LZO8.3GB2.9GB49.3MB/s74.6MB/s

3. 压缩方式选择

Alt text

4. 压缩参数配置

4.1 为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器

压缩格式对应的编码/解码器
DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
gziporg.apache.hadoop.io.compress.GzipCodec
bzip2org.apache.hadoop.io.compress.BZip2Codec
LZOcom.hadoop.compression.lzo.LzopCodec
Snappyorg.apache.hadoop.io.compress.SnappyCodec

4.2 在Hadoop中启用压缩,配置如下参数

文件名参数默认值阶段建议
core-site.xmlio.compression.codecs无,这个需要在命令行输入hadoop checknative查看输入压缩Hadoop使用文件扩展名判断是否支持某种编解码器
mapred-site.xmlmapreduce.map.output.compressfalsemapper输出这个参数设为true启用压缩
mapred-site.xmlmapreduce.map.output.compress.codecorg.apache.hadoop.io.compress.DefaultCodecmapper输出企业多使用LZO或Snappy编解码器在此阶段压缩数据
mapred-site.xmlmapreduce.output.fileoutputformat.compressfalsereducer输出这个参数设为true启用压缩
mapred-site.xmlmapreduce.output.fileoutputformat.compress.codecorg.apache.hadoop.io.compress.DefaultCodecreducer输出使用标准工具或者编解码器,如gzip和bzip2

5. 压缩实操

5.1 Map输出端采用压缩

java
// 开启map端输出压缩
conf.setBoolean("mapreduce.map.output.compress", true);

// 设置map端输出压缩方式
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class,CompressionCodec.class);

5.2 Reduce输出端采用压缩

java
// 设置reduce端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);

// 设置压缩的方式
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);