0%

Hadoop-11-Hadoop数据压缩

数据压缩概述

压缩的好处和坏处

压缩的优点:以减少磁盘IO、减少磁盘存储空间。

压缩的缺点:增加CPU开销。

压缩原则

  1. 运算密集型的Job,少用压缩。
  2. IO密集型的Job,多用压缩。

MR支持的压缩编码

压缩算法对比介绍

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

压缩性能的比较

压缩算法 原始文件大小 压缩文件大小 压缩速度 解压速度
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
Snappy 8.3GB 4.2GB 250MB/s 500MB/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.compression.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

要在Hadoop中启用压缩,可以配置如下参数

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

压缩实操案例

输入压缩

输入压缩与之前直接对文件进行统计操作在使用上没有任何区别,只是输入变成了前面MR支持的压缩编码格式的文件。

image-20230721160729470

代码内容不用修改,只需要把输入文件路径改一下即可。

image-20230721160847270

结果正常。

Map压缩

此时是对Map阶段的输出结果进行压缩,然后再传入到Reduce阶段。

只需在Driver中的Configuration做以下配置即可。

1
2
3
Configuration conf = new Configuration();
conf.set("mapreduce.map.output.compress", "true");
conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.DefaultCodec");

结果展示:

未添加Map压缩的结果。

image-20230721161108808

添加Map压缩后的结果。

image-20230721161434342

可以看到经过压缩后映射输出物化字节数发送了明显的减少。

Reduce压缩

此时是对MR的输出结果进行压缩后再输出。

只需要再Driver阶段添加输出配置即可。

1
2
3
4
5
6
7
        // 设置reduce端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);

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

结果如下所示:

image-20230721162321942

-------------本文结束感谢您的阅读-------------