Hadoop数据压缩
1. 概述
- 压缩的好处和坏处
优点:以减少磁盘IO、减少磁盘存储空间。
缺点:增加CPU开销。
- 压缩原则
密集型的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. 压缩方式选择

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
conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class,CompressionCodec.class);
5.2 Reduce输出端采用压缩
java
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
评论