您现在的位置是:首页 >学无止境 >MapReduce【数据压缩】网站首页学无止境
MapReduce【数据压缩】
目录
概述
压缩的优缺点
优点
在shuffle阶段可以通过数据压缩来优化MapReduce作业的执行
《Hadoop权威指南》7.3.1 map 端 -p196:
在将压缩 map 输出写到磁盘的过程中对它进行压缩往往是一个好的主意,因为这样写入磁盘的速度会很快,节约磁盘空间,并且减少传给 reducer 的数据量。在默认情况下,输出是不压缩的,但只要将 mapreduce.map.output.compress 设置为 true ,就可以轻松启用这个功能。
缺点
reduce端对数据进行处理时需要解压缩,增加CPU开销
《Hadoop权威指南》7.3 reduce 端 -p197:
为了合并,压缩的 map 输出都必须在内存中被解压缩。
压缩的原则
- 运算密集型的Job,少用压缩(+-*/运算频繁)
- IO密集型的Job,多用压缩
MapReduce支持的压缩编码
压缩算法对比
压缩格式 | Hadoop3.x自带? | 算法 | 文件扩展名 | 是否可切片 | 压缩后原程序是否需要修改 |
---|---|---|---|---|---|
DEFLATE | 是 | DEFLATE | .deflate | 否 | 不需要 |
Gzip | 是 | DEFLATE | .gz | 否 | 不需要 |
bzip2 | 是 | bzip2 | .bz2 | 是 | 不需要 |
LZO | 否 | LZO | .lzo | 是 | 需要建索引,还需要指定输入格式 |
Snappy | 是 | Snappy | .snappy | 否 | 不需要 |
压缩性能比较
压缩算法 | 原始文件大小 | 压缩文件大小 | 压缩速度 | 解压速度 |
---|---|---|---|---|
gzip | 8.3GB | 1.1GB | 17.5MB/S | 58MB/S |
bzip2 | 8.3GB | 1.8GB | 2.4MB/S | 9.5MB/S |
LZO | 8.3GB | 2.9GB | 49.3MB/S | 74.6MB/S |
此外,Snappy的压缩速度能达到250MB/S,解压速度500MB/S!
压缩方式的选择
Gzip 压缩
Bzip2 压缩
Lzo 压缩
Snappy 压缩
压缩位置选择
压缩位置选择
1、输入端采用压缩
- 当数据量小于块大小,重点考虑压缩和解压缩速度比较快的LZO/Snappy(尤其是Snappy)
- 数据量非常大,重点考虑支持切片的Bzip2和LZO
2、Mapper输出采用压缩
需要考虑 MapTask网络传输到 ReduceTask ,跨服务器通讯。重点考虑压缩和解压缩块的LZO、Snappy(尤其是Snappy)。
3、Reducer输出采用压缩
如果数据永久保存,考虑压缩率比较高的Bzip2和Gzip(毕竟这一步后直接就输出到文件系统了,可以压缩的慢一点)。
如果这个数据还要作为下一个 MapTask 的输入,就需要考虑数据量和是否支持切片了。
压缩实际开发的配置
配置参数
压缩格式 | 对应的编码/解码器 |
---|---|
DAFLATE | org.apache.hadoop.io.compress.DefaultCodec |
gzip | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | org.apache.hadoop.io.compress.LzopCodec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
注意:Snappy需要在 CentOS7.5 + hadoop3.0 的环境。
参数 | 默认值 | 阶段 | 建议 |
---|---|---|---|
io.compression.codecs
(在 core-site.xml 中配置)
|
默认为空,这个需要在命令行输入
hadoop checknative 查看
|
map端输入压缩
|
Hadoop 使用文件扩展
名判断是否支持某种
编解码器
|
mapreduce.map.output.compr
ess(在 mapred-site.xml 中
配置)
|
false(默认)
|
mapper 输出
|
这个参数设为 true 启
用压缩
|
mapreduce.map.output.compr
ess.codec(在 mapred-
site.xml 中配置)
|
org.apache.hadoop.io.com
press.DefaultCodec
|
mapper 输出
|
这个参数设为 true 启
用压缩
|
mapreduce.output.fileoutpu
tformat.compress(在
mapred-site.xml 中配置)
|
false(默认)
|
reducer 输出
|
这个参数设为 true 启
用压缩
|
mapreduce.output.fileoutpu
tformat.compress.codec(在
mapred-site.xml 中配置)
|
org.apache.hadoop.io.com
press.DefaultCodec
|
reducer 输出
|
使用标准工具或者编
解码器,如 gzip 和
bzip2
|
代码
在wordcount案例的基础上,只需要在运行类中添加语句,Mapper类和Reducer不需要修改
Map输出端采用压缩
// 开启 map 端输出压缩
conf.setBoolean("mapreduce.map.output.compress", true);
// 设置 map 端输出压缩方式
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);
Reduce 输出端采用压缩
// 设置 reduce 端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);
// 设置压缩的方式
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
注意:
1. 输入端和输出端的压缩方式可以不一样,hadoop会根据后缀名来自行匹配相应的压缩格式。
2. 本地模式下不可以使用Snappy压缩方式,因为Snappy需要hadoop3.0版本和CentOS7.5的环境,而windows环境下是不可以的。
至此,MapReduce的视频学习结束,接下来会继续学习YARN的相关课程,以及看着书来复习MapReduce的其他内容,毕竟视频内容可能有很多不够细节的地方,hadoop是大数据的重中之重,需要不断反复理解掌握,不能急于求成。