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

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