Hadoop的压缩
Posted R语言数据分析与建模
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop的压缩相关的知识,希望对你有一定的参考价值。
在集群中大规模的数据的转换与传输是一项艰巨的任务,而Hadoop自带一套特有的文件I/O系统,使得这项艰巨的任务变得简单。
1.压缩
Hadoop文件数据存取与计算需要集群中众多的节点,通过网络连接方式进行相互协作完成作业,节点间的数据采用压缩形式进行传输,这样可以减少存储文件所需的磁盘空间,而且可以加数据在网络和磁盘上的传输。
压缩类型,在采用压缩算法传输数据前,需要考虑的问题是Hadoop需要能够辨识压缩算法计算后的文件,依据业务需求考虑压缩算法的空间占比的均衡。
DEFLATE是同时使用了LZ77算法和哈夫曼编码是一个无损数据压缩算法。它最初是是由菲尔.卡茨为他的PKZIP软件第二版所定义的,后来被RFC1951标准化。它是一个标准压缩算法,该算法的标准实现是zlib,压缩与解压缩的源码可以自由,通用的压缩库zlib上找到。目前没有命令工具生成DEFLATE格式,通常使用gzip格式。注意!gzip文件格式只是在DEFLATE格式上增加了一个文件头和一个文件尾。DEFLATE文件的扩展名为Hadoop约定的。
bzip2是JulianSeward开发并按照自由软件/开源软件协议发布的数据压缩算法及程序。从压缩率角度讲,bzip2比传统的gzip或者zip的压缩效率更高,但是它的压缩速度较慢。
LZO是致力于提高解压速度的一种数据压缩法,是Lempel-Ziv -Oberhumer的缩写。该算法是无损算法,参考实现程序是线程安全的。如果LZO文件已经在预处理过程中被索引了,LZO文件是可以切分的。
LZ4是一种无损压缩算法,着重于压缩和解压缩速度。它属于面向字节的LZ77压缩方案家族。该算法提供一个比LZO算法稍差的压缩率-这逊于gzip算法。但是他的压缩速度类似于LZO-比gzip快几倍,解压速度明显快于LZO.
Snappy是Google基于LZ77的思路用C++语言编写快速数据压缩与解压缩程序库。对于表格中的“是否可以切分”表示对应的算法是否支持切分,也就是说是否可以搜索数据流的任意位置(即从某块开始被切分成单个Block开始)并进一步往下读取数据。可切分压缩格式,尤其适合MapReduce.
编解码器指的是一个对另外一个信号或者数据流进行编码操作的设备或者程序。它实现了一种压缩/解压缩算法。在Hadoop中,一个对CompressionCode接口的实现代表一个Code,用于实例化相应的压缩类对象,Hadoop对所有常用的压缩类都实现CompressionCode接口。
DEFLATE,gzip和gzip和bzip2由java实现,故在Hadoop压缩类库调用中可直接使用,LZO,LZ4和snappy则需要在Hadoop平台上进行工具安装后再使用。
在压缩类应用过程中,为了保证HADOOP的性能,建议使用“原生”类库来实现压缩和解压缩。例如,在一个测试中,使用原生gzip类库可以减少约一半的解压缩时间和约10%的压缩时间(与内置java实现相比)。可以通过java系统的java.library.path属性指定原生代码库。在Hadoop中如果不通过设置属性,也可以手动设置该属性。默认情况下,Hadoop会根据自身运行的平台搜索原生代码库,如果找到相应的代码库,就会自动加载。也可以将属性hadoop.native.lib的值设置成false,禁用原生代码库。
Hadoop提供压缩API供用户使用。其中要位于包“import org.apache.io.compress.compression codec”中,提供了compressionCodec接口,同时提供CompressionCodecFactory类,通过它可以找到一个给定的文件名正确的编码器,即通过读取压缩文件的扩展名来推断需要使用哪个Codec。
2.compression codec接口
compression codec接口的源码位于“org.apache.hadoop.io.compress.compression codec”中,所有已知的实现类,同时包含很多方法。
3.CompressionCodecFactory类
4.压缩池
在Hadoop程序运行过程中,如果频繁进行压缩和解压工作,会大量占用系统的资源,对系统来说是一个繁重的工作。Hadoop提供了CodecPool类,位于源码包“org.apache.hadoop.io.compress”,它在设计中可以重用压缩程序和解压程序,尽量缩减了系统在创建这些对象时的开销。
5.Hadoop中使用压缩
对于Hadoop来说,压缩是透明的,可以根据程序的后缀名自动识别压缩,从而产生对应压缩对象和调用相关格式,也就是说如果输入是被压缩后的数据,那么Hadoop可以自动根据后缀名进行压缩,因此对于处理程序来看,压缩或者不压缩的结果都是一样的,都是从中可提取所需要的材料。
Hadoop任务的输入端和输出端都是采用压缩技术的
先来看一下Hadoop任务端。在首次编写MapReduce程序,采用测试数据是两个文件,参与数据块(Block)是两个,启用两个Mapper进行计算。一半情况下,一个数据块会启用一个Mapper类,那么如果在Mapper读取数据采用压缩格式的话,就会使原文件的数据块量降低,进而启用的Mapper数量减少,实现了计算相同的结果启用了较少数量Mapper的愿望。对于输出端,通常有两种方式可以设置输出端的压缩操作。第一种是打开Hadoop_Home/src/mapred/mapred_default.xml文件,通过该文件中对压缩相应属性的配置,完成Hadoop压缩的启用和协调。
以上是关于Hadoop的压缩的主要内容,如果未能解决你的问题,请参考以下文章