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);

 

 

posted @ 2020-07-27 00:44  Velome  阅读(194)  评论(0)    收藏  举报