摘要:
在大数据应用中,首先需要考虑的问题就是如何存储大量数据(HDFS)。通常情况下,我们会将每天产生的生产日志文件存储到HDFS中,久而久之会占用大量磁盘空间。而压缩技术可以大大减少数据文件对于磁盘的占用。而且在读写HDFS的时候,可以减少磁盘和网络的IO,提高MapReduce作业的效率。但是,压缩也会在一定程度上增加CPU的消耗,所以在使用压缩的时候应该综合考虑,合理使用。
注意: 压缩特性运用得当能提高性能,但运用不当也可能降低性能。
基本原则:
(1)运算密集型的 job,少用压缩
(2) IO 密集型的 job,多用压缩
一、MR支持的压缩
为了支持多种压缩/解压缩算法, Hadoop 引入了编码/解码器,如下表所示
压缩性能的比较
二、压缩方式的选择
1、Gzip 压缩
优点:压缩率比较高,而且压缩/解压速度也比较快; hadoop 本身支持,在应用中处理gzip 格式的文件就和直接处理文本一样;大部分 linux 系统都自带 gzip 命令,使用方便。
缺点:不支持 split。
应用场景: 当每个文件压缩之后在 130M 以内的(1 个块大小内),都可以考虑用 gzip压缩格式。 例如说一天或者一个小时的日志压缩成一个 gzip 文件,运行 mapreduce 程序的时候通过多个 gzip 文件达到并发。 hive 程序, streaming 程序,和 java 写的 mapreduce 程序完全和文本处理一样,压缩之后原来的程序不需要做任何修改。
2、Bzip2 压缩
优点:支持 split;具有很高的压缩率,比 gzip 压缩率都高; hadoop 本身支持,但不支持 native;在 linux 系统下自带 bzip2 命令,使用方便。
缺点:压缩/解压速度慢;不支持 native。
应用场景: 适合对速度要求不高,但需要较高的压缩率的时候,可以作为 mapreduce 作业的输出格式; 或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持 split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。
3、Lzo 压缩
优点:压缩/解压速度也比较快,合理的压缩率;支持 split,是 hadoop 中最流行的压缩格式;可以在 linux 系统下安装 lzop 命令,使用方便。
缺点:压缩率比 gzip 要低一些; hadoop 本身不支持,需要安装;在应用中对 lzo 格式的文件需要做一些特殊处理(为了支持 split 需要建索引,还需要指定 inputformat 为 lzo 格式)。
应用场景: 一个很大的文本文件,压缩之后还大于 200M 以上的可以考虑,而且单个文件越大, lzo 优点越越明显。
4、Snappy 压缩
优点:高速压缩速度和合理的压缩率。
缺点:不支持 split;压缩率比 gzip 要低; hadoop 本身不支持,需要安装;
应用场景: 当 Mapreduce 作业的 Map 输出的数据比较大的时候,作为 Map 到 Reduce的中间数据的压缩格式;或者作为一个 Mapreduce 作业的输出和另外一个 Mapreduce 作业的输入。
三、MR过程中压缩位置选择
四、启用压缩的配置
1、core-site.xml
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
com.hadoop.compression.lzo.LzoCodec,
org.apache.hadoop.io.compress.Lz4Codec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>
这里我将所需要的所有压缩方式都添加进去了,大家可根据自己需要进行增删。
2、mapred-site.xml
这里以BZip2为例,第一个参数为打开压缩。
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
五、总结
在实际使用中,我们可以设置map和reduce的压缩参数,具体参考hadoop官网mapred-defalult.xml。
如果是在hive中使用压缩,我们设置压缩格式或者其他参数,可以用在hive交互窗口使用set key=value这种格式。查看某个参数的值是set key。
如查看输出是否支持压缩:set hive.exec.compress.output=true,就是允许输出使用压缩输出。