Hadoop之数据压缩

1、压缩作用

(1)能有效减少底层存储(HDFS)读写字节数。

(2)提高网络带宽和磁盘空间的效率

在运行MR程序时,IO操作,网络数据传输,Shuffle和Merge要花费大量的时间,当数据量很大和工作负载密集时,使用数据压缩显得尤为重要。

2、压缩的策略和原则

压缩是提高Hadoop运行效率的优化策略

通过对Mapper、Reducer运行过程的数据进行压缩,减少磁盘IO,提高MR运行速度

注意:采用压缩技术虽然减少了磁盘IO,但是增加了CPU运算负担,根据场景合理运用压缩技术。

压缩基本原则

(1)运算密集型job,少用压缩

(2)IO密集型job,多用压缩

3、MapReduce支持的压缩编码格式

压缩格式

hadoop自带?

算法

文件扩展名

是否可切分

换成压缩格式后,原来的程序是否需要修改

DEFLATE

是,直接使用

DEFLATE

.deflate

和文本处理一样,不需要修改

Gzip

是,直接使用

DEFLATE

.gz

和文本处理一样,不需要修改

bzip2

是,直接使用

bzip2

.bz2

和文本处理一样,不需要修改

LZO

否,需要安装

LZO

.lzo

需要建索引,还需要指定输入格式

Snappy

否,需要安装

Snappy

.snappy

和文本处理一样,不需要修改

(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

(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

4、压缩格式的解析

(1)Gzip压缩

优势:压缩率比较高,而且压缩/解压速度比较块,Hadoop本身支持,处理Gzip格式的文件和处理文本文件一样,Linux系统都自带Gzip命令,使用方便

劣势:不支持文件切割split

适用场景:

每个文件压缩后在130M以内都可以使用Gzip压缩

(2)Bzip2压缩

优势:支持切割Split,具有很高的压缩率,比Gzip压缩率高,Hadoop本身自带,使用方便

劣势:压缩和解压缩速度慢

适用场景:

1)适合对速度要求不高,但需要较高的压缩率的时候;

2)输出文件较大,数据需要压缩存档减少磁盘空间,且这类数据不经常使用

3)对单个很大文件想压缩减少存储空间,同时需要支持split。

(3)Lzo压缩

优势:压缩和解压缩速度较快,支持split,是Hadoop最常用的压缩格式,在Linux系统中安装lzop命令后,即可使用

劣势:压缩率比Gzip低,Hadoop本身不支持,需要安装,在应用程序中对lzo格式文件需要做一些特殊处理,为了支持split要建立索引,同时还要指定InputFormat为lzo格式

适用场景:

一个大文件,压缩后还大于200M以上可以考虑使用,单个文件越大,使用lzo优点越明显

(4)Snappy压缩

优势:高速压缩速度,压缩率也不错

劣势:不支持split,压缩率比Gzip低,Hadoop本身不支持,需要安装

适用场景:

1)当MR作业的Map端输出数据较大,Snappy可以作为Map到Reduce的中间数据的压缩格式

2)作为一个MR作业的输出和另外一个MR作业的输入的中间数据的压缩格式。

5、压缩位置选择

6、压缩参数配置

参数

默认值

阶段

建议

io.compression.codecs  

(在core-site.xml中配置)

org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec

 

输入压缩

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输出

企业多使用LZOSnappy编解码器在此阶段压缩数据

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输出

使用标准工具或者编解码器,如gzipbzip2

mapreduce.output.fileoutputformat.compress.type(在mapred-site.xml中配置)

RECORD

reducer输出

SequenceFile输出使用的压缩类型:NONEBLOCK

7、MR作业开启压缩

(1)Map输出端采用压缩

在Driver端添加

// 开启map端输出压缩
configuration.setBoolean("mapreduce.map.output.compress", true);
// 设置map端输出压缩方式
configuration.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);

(2)Reduce输出端采用压缩

// 设置reduce端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);
// 设置压缩的方式
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
发布了69 篇原创文章 · 获赞 2 · 访问量 4486

猜你喜欢

转载自blog.csdn.net/zuodaoyong/article/details/104115608