hadoop数据压缩

对于Hadoop,可以进行压缩有三个阶段
分别是Map输入,Map输出,Reduce输出
Map阶段
map阶段的压缩主要可以减少读取磁盘的io操作,因为合理的设置都是会避免网络IO的产生,如果还产生了网络io那么肯定是切片不合理,需要修改切片设置
map阶段压缩存在一个问题,一般的压缩方式不能切片,会当成一个整的文件进行map操作,这种首先考虑的是能切片的压缩格式,并且解压速度快的
MapOut阶段
MapOut阶段是在shuffle阶段,需要在CPU时间与磁盘时间之间找一个平衡,需要CPU加密的速度能快过磁盘IO速度,这样CPU就不会成为瓶颈,既完成了压缩,又完成了落盘的操作,对于压缩来说,希望该压缩文件尽可能的小,从而更快的通过磁盘和网络io,到达指定的Reduce 节点,并且还要保障在Reduce的时候,解压的速度足够快
ReduceOut阶段
对于Reduce阶段来时,需要考虑结果输出的速度,以及是否有后续的MR程序,此阶段要权衡压缩比例与CPU孰高孰低的问题,
常用的压缩方式总结
|
压缩格式 |
hadoop自带? |
算法 |
文件扩展名 |
是否可切分 |
换成压缩格式后,原来的程序是否需要修改 |
|
DEFLATE |
是,直接使用 |
DEFLATE |
.deflate |
否 |
和文本处理一样,不需要修改 |
|
Gzip |
是,直接使用 |
DEFLATE |
.gz |
否 |
和文本处理一样,不需要修改 |
|
bzip2 |
是,直接使用 |
bzip2 |
.bz2 |
是 |
和文本处理一样,不需要修改 |
|
LZO |
否,需要安装 |
LZO |
.lzo |
是 |
需要建索引,还需要指定输入格式 |
|
Snappy |
是,直接使用 |
Snappy |
.snappy |
否 |
和文本处理一样,不需要修改 |
LZO和Snappy压缩速度快,因此企业中通常采用LZO和Snappy压缩,如果需要切片,就选LZO,不需要切片就使用Snappy。
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 |
压缩性能的比较
|
压缩算法 |
原始文件大小 |
压缩文件大小 |
压缩速度 |
解压速度 |
|
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 |
常用压缩参数设置
|
参数 |
默认值 |
阶段 |
建议 |
|
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 |
|
mapreduce.output.fileoutputformat.compress.type(在mapred-site.xml中配置) |
RECORD |
reducer输出 |
SequenceFile输出使用的压缩类型:NONE和BLOCK |
在MR程序中源码中设置压缩方式
// 开启map端输出压缩 configuration.setBoolean("mapreduce.map.output.compress", true); // 设置map端输出压缩方式 configuration.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class,CompressionCodec.class);
// 设置reduce端输出压缩开启 FileOutputFormat.setCompressOutput(job, true); // 设置压缩的方式 FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);

浙公网安备 33010602011771号