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 压缩性能的比较

压缩算法 原始文件大小 压缩文件大小 压缩速度 解压速度
gzip 8.3GB 1.8GB 17.5MB/s 58MB/s
bzip2 8.3GB 1.1GB 2.4MB/s 9.5MB/s
LZO 8.3GB 2.9GB 49.3MB/s 74.6MB/s

3. 压缩方式选择

Alt text

4. 压缩参数配置

4.1 为了支持多种压缩/解压缩算法,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.compression.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

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

文件名 参数 默认值 阶段 建议
core-site.xml io.compression.codecs 无,这个需要在命令行输入hadoop checknative查看 输入压缩 Hadoop使用文件扩展名判断是否支持某种编解码器
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和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);

评论