关于压缩
压缩会减少磁盘空间、磁盘IO以及网络IO的负担,但会增加CPU负担
在任意的MapReduce阶段都可以启动压缩
使用原则
- 运算密集型的job,少用压缩
- IO密集型的Job,多用压缩
MR支持的压缩
压缩格式 | Hadoop集成 | 算法 | 扩展名 | 是否可splic | 更换压缩格式是否需要修改代码 |
---|---|---|---|---|---|
DEFLATE | 直接使用 | DEFLATE | .deflate | 否 | 不需要修改 |
Gzip | 直接使用 | DEFLATE | .gz | 否 | 不需要修改 |
bzip2 | 直接使用 | bzip2 | .bz2 | 是 | 不需要修改 |
LZO | 需要安装 | LZO | .lzo | 是 | 需要建立索引并指定输入格式 |
Snappy | 需要安装 | Snappy | .snappy | 否 | 不需要修改 |
对应编码器\解码器
压缩格式 | 对应的编码/解码器 |
---|---|
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 http://google.github.io/snappy/
On a single core of a Core i7 processor in 64-bit mode, Snappy compresses at about 250 MB/sec or more and decompresses at about 500 MB/sec or more.
Gzip
优点:压缩率比较高,压缩/解压缩速度比较快;hadoop自身支持,应用中处理Gzip格式和文件中直接处理文件相同,使用方便
缺点: 不支持split
应用场景: 当单个文件压缩后在130m之内(1个block大小内),可以考虑Gzip压缩格式
案例:每天或几小时时段日志,生成小于block大小文件
Bzip2
优点:支持Split,比Gzip压缩率高;hadoop自身支持,系统自带Bzip命令
缺点:压缩/解压缩速度慢。不支持Native(本地化,需要根据操作系统单独编译Bzip2)
应用场景:适合对速度要求不高,但需要较高的压缩率时
- 可作为MapReduce作业的输出格式;
- 或者输出之后的数据比较大,处理之后数据需要压缩存档减少磁盘空间,并且改数据以后使用较少的情况。
- 对单个很大的文件向压缩减少存储空间,同时需要支持spilt,且兼容之前程序的情况
Lzo
优点:Hadoop中最流行的压缩格式之一,支持split,压缩/解压缩速度比较快,合理压缩率;在linux系统中安装lzop使用
缺点:压缩率比Gzip低一些;hadoop自身不支持,需要安装,在应用中为了支持spilt需要建立索引和指定ImputFormat为Lzo格式
案例:文本文件压缩后还大于200m以上,单个文件越大,优点越明显
Snappy
优点:高速压缩速度以及合理的压缩率
缺点:不支持split;压缩比比Gzip低,Hadoop自身不支持,需要安装
案例:适合Shuffle时使用。
- 当Mapreduce作业的Map输出的数据比较大时,作为Map到Reduce的中间数据压缩
- 作为Mapreduce作业输出到另外一个Mapreduce作业输入时
总结
bzip2 压缩比最高,压缩/解压缩速度最慢
snappy 压缩速度最快,压缩比凑合
deffate,gizp 折中
关于压缩位置
-
MapReduce 输入数据为压缩数据
在大量数据,并需要重复处理的情况下,应考虑对输入进行压缩。除Lzo外,Hadoop会通过文件扩展名匹配编解码进行压缩/解压缩
-
Mapper 输出采用压缩
当Map任务输出中间数据量很大时,考虑此阶段采用压缩,能显著改善内部数据shuffle过程(shuffle是hadoop中消耗资源最多的环节)。如果发现数据量大造成网络传输缓慢,应考虑使用压缩技术。可用于压缩Mapper输出的速度,解码器包括LZO或者Snappy
-
Reduce 输出采用压缩
在此阶段启用压缩技术能够减少要存储的数据量,因此降低磁盘所需空间。
注:LZO是供Hadoop压缩数据用的通用压缩编码器。其涉及目标是达到与磁盘读取速度相当的压缩速率,因此速度是有限考虑的因素,而不是压缩率。
与Gzip编解码器相比,他的压缩速度是Gzip的5倍,解压缩速度是Gzip的2倍,相同文件用LZO压缩后比Gzip压缩后大50%,单比压缩前小25%-50%,这对改善性能非常有利,Map阶段完成时间快近4倍
压缩相关参数
core-site.xml
io.compression.codecs : 代表整个Job运行期间,可以使用哪些压缩格式!
配置这个参数后,配置的压缩格式会被自动初始化!
默认值: deflate,gzip,bzip2
mapred-site.xml
mapreduce.map.output.compress: map阶段输出的key-value是否采用压缩
默认值: false
mapreduce.map.output.compress.codec: map阶段输出的key-value采用何种压缩
默认值: deflate
mapreduce.output.fileoutputformat.compress: job在reduce阶段最终的输出是否采用压缩
默认值: false
mapreduce.output.fileoutputformat.compress.codec: job在reduce阶段最终的输出采用何种压缩
默认值: deflate
mapreduce.output.fileoutputformat.compress.type: 如果Job输出的文件以SequenceFile格式!
SequenceFile中的数据,要以何种形式进行压缩!
NONE: 是否压缩及如何压缩取决于操作系统
RECORD(默认): 每个key-value对作为一个单位,压缩一次
BLOCK: SequenceFile中每个block压缩一次!(SequenceFile中的block默认为64K)