Hadoop 作为一个较通用的海量数据处理平台,每次运算都会需要处理大量数据,我们会在 Hadoop 系统中对数据进行压缩处理来优化磁盘使用率,提高数据在磁盘和网络中的传输速度,从而提高系统处理数据的效率。在使用压缩方式方面,主要考虑压缩速度和压缩文件的可分割性。
综合所述,使用压缩的优点如下:
- 节省数据占用的磁盘空间;
- 加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度。
1、压缩格式
Hadoop 对于压缩格式的是自动识别。如果我们压缩的文件有相应压缩格式的扩展名(比如 lzo,gz,bzip2 等)。Hadoop 会根据压缩格式的扩展名自动选择相对应的解码器来解压数据,此过程完全是 Hadoop 自动处理,我们只需要确保输入的压缩文件有扩展名。
Hadoop 对每个压缩格式的支持, 详细见下表:
2、性能对比
Hadoop 下各种压缩算法的压缩比,压缩时间,解压时间见下表:
因此我们可以得出:
- Bzip2 压缩效果明显是最好的,但是 bzip2 压缩速度慢,可分割。
- Gzip 压缩效果不如 Bzip2,但是压缩解压速度快,不支持分割。
- LZO 压缩效果不如 Bzip2 和 Gzip,但是压缩解压速度最快!并且支持分割!
这里提一下,文件的可分割性在 Hadoop 中是很非常重要的,它会影响到在执行作业时 Map 启动的个数,从而会影响到作业的执行效率!
所有的压缩算法都显示出一种时间空间的权衡,更快的压缩和解压速度通常会耗费更多的空间。在选择使用哪种压缩格式时,我们应该根据自身的业务需求来选择。
3、压缩的使用
MapReduce 可以在三个阶段中使用压缩。
1、输入阶段
如果输入的文件是压缩过的,那么在被 MapReduce 读取时,它们会被自动解压。
2、map输出中间结果
(1) 在 core-site.xml 文件中配置,代码如下
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
(2)使用Java代码指定
conf.setCompressMapOut(true);
conf.setMapOutputCompressorClass(GzipCode.class);
3、reduce输出最终结果
(1) 在 core-site.xml 文件中配置,代码如下
<property>
<name>mapred.output.compress</name>
<value>true</value>
</property>
(2)使用Java代码指定
conf.setBoolean(“mapred.output.compress”,true);
conf.setClass(“mapred.output.compression.codec”,GzipCode.class,CompressionCodec.class);