目录
前言:
大数据时代下,数据量的存储量大大增加。应运而生的大数据平台也不断出现。数据的传递在平台中的效率与内存占用也逐渐成为一个平台是否合格的评断标准。本文将阐述hadoop数据压缩的不同方式与各方式的使用环境。
一 压缩的原则与优劣
(1)压缩原则
由于hadoop中数据的处理需要从客户端传递至map,再由map端传递至reduce进行处理。因此数据在传递过程中的量级大小会直接影响到传递速率与整个工作处理效率。因此,我们认为数据压缩的原则为:运算密集型的job,应当少用压缩算法。IO密集型的job,应当多使用压缩算法。
(2)压缩的优点与缺点
压缩的优点:首先压缩能够减小传递文件的大小,所以压缩能够减少磁盘的IO,同时也能减少磁盘存储空间。
压缩的缺点:应为压缩需要占用CPU来开启压缩算法。所以压缩的缺点为增大了CPU的开销。
二 MapReduce支持的压缩编码
(1)压缩算法介绍
压缩格式 | 是否为Hadoop自带 | 所支持的算法 | 文件扩展名 | 是否可以进行切片 | 换成压缩格式后,是否需要进行其他修改 |
DEFLATE | 是 | DEFLATE | .deflate | 否 | 不需要进行修改 |
Gzip | 是 | DEFLATE | .gz | 否 | 不需要进行修改 |
bzip2 | 是 | bzip2 | .bz2 | 是 | 不需要进行修改 |
LZO | 否,需要自行安装 | LZO | .lzo | 是 | 需要建立索引,且需要指定输入格式 |
Snappy | 是 | Snappy | .snappy | 否 | 不需要进行修改 |
(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 |
Snappy | 8.3GB | 2.7GB | 250MB/S | 250MB/S |
三 压缩方式选择
我们在选择压缩方式时要考虑多个方面:压缩/解压速度、压缩率(压缩后存储大小)、压缩后是否可以切片等。
(1)各压缩方式的优缺点
压缩方式 | 优点 | 缺点 |
Gzip压缩 | 压缩率比较高 | 不支持切片; 压缩/解压速度一般; |
Bzip2压缩 | 压缩率高; 支持切片; | 压缩/解压速度慢; |
Lzo压缩 | 压缩/解压速度快; 支持切片 | 压缩率一般; 需要切片需要额外建立索引; |
Snappy压缩 | 压缩和解压速度快; | 不支持切片; 压缩率一般; |
因此,当数据链小于块大小时,考虑压缩与解压缩速度快的Lzo/Snappy。
当数据量非常大时,需要对数据进行切片,需要考虑支持切片的Bzip2和LZO。
(2)压缩阶段选择
压缩这个可以在MapReduce所作用的任意阶段启用。
输入端采用压缩 | 不需要指定编码方式,hadoop可以自动识别对应的解码方式对文件进行压缩与解压缩。 |
map输出采用压缩 | 为了减少maptask与reducetask之间的网络IO传输,重点考虑压缩与解压缩快的LZO与Snappy。 |
reducer输出采用压缩 | 如果数据需要永久保存,考虑压缩率较高的Bzip2和Gzip。 如果需要传递给下一个MapReduce需要考虑是否需要进行切片。 |
四 压缩参数配置与集群设置
(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)如果需要在Hadoop中启用压缩,需要配置如下参数
参数 | 默认值 | 阶段 |
io.compression.codecs (在core-site.xml中配置) | 无,这个需要在命令行输入hadoop checknative查看 | 输入压缩 |
mapreduce.map.output.compress (在mapred-site.xml中配置) | false | mapper输出 |
mapreduce.map.output.compress.codec (在mapred-site.xml中配置) | org.apache.hadoop.io.compress.DefaultCodec | mapper输出 |
mapreduce.output.fileoutputformat .compress(在mapred-site.xml中配置) | false | reducer输出 |
mapreduce.output.fileoutputformat .compress.codec(在mapred-site.xml中配置) | org.apache.hadoop.io.compress.DefaultCodec | reducer输出 |
五 压缩案例
(1)Map输出端采用压缩
即使你的MapReduce的输入输出文件都是未压缩的文件,你仍然可以对Map任务的中间结果输出做压缩,因为它要写在硬盘并且通过网络传输到Reduce节点,对其压缩可以提高很多性能,这些工作只要设置两个属性即可。只需在Driver驱动类中增加对应参数即可。
// 开启map端输出压缩
conf.setBoolean("mapreduce.map.output.compress", true);
// 设置map端输出压缩方式
conf.setClass("mapreduce.map.output.compress.codec",BZip2Codec.class,
CompressionCodec.class);
(2)reducer输出端采用压缩
// 设置reduce端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);
// 设置压缩的方式
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);