Hadoop在MapReduce中行使压缩详解大数据应用

来源:互联网 / 作者:SKY / 2017-04-30 14:30 / 点击:
Hadoop对付压缩名目标是透明辨认,我们的MapReduce使命的执行是透明的,Hadoop可以或许自动为我们将压缩的文件解压,而不消我们去体谅。

Hadoop对付压缩文件的支持

假如我们压缩的文件有响应压缩名目标扩展名(好比lzo,gz,bzip2等),hadoop就会按照扩展名去选择解码器解压。

Hadoop在MapReduce中利用压缩详解

hadoop对每个压缩名目标支持,具体见下表:

假如压缩的文件没有扩展名,则需 要在执行mapreduce使命的时辰指定输入名目.

hadoop jar /usr/home/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-streaming-0.20.2-CD H3B4.jar 

-file /usr/home/hadoop/hello/mapper.py -mapper /usr/home/hadoop/hello/mapper.py 

-file /usr/home/hadoop/hello/reducer.py -reducer /usr/home/hadoop/hello/reducer.py 

-input lzotest -output result4 

-jobconf mapred.reduce.tasks=1 

*-inputformat org.apache.hadoop.mapred.LzoTextInputFormat*  

hadoop下各类压缩算法的压缩比,压缩时刻,解压时刻见下表:

压缩算法   原始文件巨细   压缩后的文件巨细   压缩速率   解压缩速率  
gzip   8.3GB   1.8GB   17.5MB/s   58MB/s  
bzip2   8.3GB   1.1GB   2.4MB/s   9.5MB/s  
LZO-bset   8.3GB   2GB   4MB/s   60.6MB/s  
LZO   8.3GB   2.9GB   49.3MB/S   74.6MB/s  

hadoop各类压缩算法的优弱点简述

在思量怎样压缩那些将由MapReduce处理赏罚的数据时,思量压缩名目是否支持支解是很重要的。思量存储在HDFS中的未压缩的文件,其巨细为1GB,HDFS的块巨细为64MB,以是该文件将被存储为16块,将此文件用作输入的MapReduce功课会建设1个输人分片(split ,也称为“分块”。对付block,我们同一称为“块”。)每个分片都被作为一个独立map使命的输入单独举办处理赏罚。

此刻假设。该文件是一个gzip名目标压缩文件,压缩后的巨细为1GB。和前面一样,HDFS将此文件存储为16块。然而,针对每一块建设一个分块是没有效的,由于不行能从gzip数据流中的恣意点开始读取,map使命也不行能独立于其他分块只读取一个分块中的数据。gzip名目行使DEFLATE来存储压缩过的数据,DEFLATE将数据作为一系列压缩过的块举办存储。题目是,每块的开始没有指定用户在数据流中恣意点定位到下一个块的起始位置,而是其自身与数据流同步。因此,gzip不支持支解(块)机制。

在这种环境下,MapReduce不支解gzip名目标文件,由于它知道输入是gzip压缩名目标(通过文件扩展名得知),而gzip压缩机制不支持支解机制。这样是以捐躯当地化为价钱:一个map使命将处理赏罚16个HDFS块。多半不是map的当地数据。与此同时,由于map使命少,以是功课支解的粒度不足细,从而导致运行时刻变长。

在我们假设的例子中,假如是一个LZO名目标文件,我们会遇到同样的题目,由于根基压缩名目不为reader提供要领使其与流同步。可是,bzip2名目标压缩文件确实提供了块与块之间的同步标志(一个48位的PI近似值),因此它支持支解机制。

对付文件的网络,这些题目会稍有差异。ZIP是存档名目,因此它可以将多个文件归并为一个ZIP文件。每个文件单独压缩,全部文档的存储位置存储在ZIP文件的尾部。这个属性表白ZIP文件支持文件界线处支解,每个分片中包罗ZIP压缩文件中的一个或多个文件。

在MapReduce我们应该行使哪种压缩名目

按照应用的详细环境来抉择应该行使哪种压缩名目。就小我私人而言,更趋向于行使最快的速率压缩,照旧行使最优的空间压缩?一样平常来说,应该实行差异的计策,并器具有代表性的数据集举办测试,从而找到最佳要领。对付那些大型的、没有界线的文件,如日记文件,有以下选项。

存储未压缩的文件。

行使支持支解机制的压缩名目,如bzip2。

在应用中将文件支解成几个大的数据块,然后行使任何一种支持的压缩名目单独压缩每个数据块(可不消思量压缩名目是否支持支解)。在这里,必要选择数据块的巨细使压缩后的数据块在巨细上相等于HDFS的块。

行使支持压缩和支解的Sequence File(序列文件)。

对付大型文件,不要对整个文件行使不支持支解的压缩名目,由于这样会丧失当地性上风,从而使低落MapReduce应用的机能。

hadoop支持Splittable压缩lzo

在hadoop中行使lzo的压缩算法可以减小数据的巨细和数据的磁盘读写时刻,在HDFS中存储压缩数据,可以使集群能生涯更多的数据,延迟集群的行使寿命。不只云云,因为mapreduce功课凡是瓶颈都在IO上,存储压缩数据就意味这更少的IO操纵,job运行越发的高效。

可是在hadoop上行使压缩也有两个较量贫困的处所:第一,有些压缩名目不能被分块,并行的处理赏罚,好比gzip。第二,其它的一些压缩名目固然支持分块处理赏罚,可是解压的进程很是的迟钝,使job的瓶颈转移到了cpu上,譬喻bzip2。

假如可以或许拥有一种压缩算法,即可以或许被分块,并行的处理赏罚,速率也很是的快,那就很是的抱负。这种方法就是lzo。

lzo的压缩文件是由很多的小的blocks构成(约256K),使的hadoop的job可以按照block的分别来split job。不只云云,lzo在计划时就思量到了服从题目,它的解压速率是gzip的两倍,这就让它可以或许节减许多的磁盘读写,它的压缩比的不如gzip,约莫压缩出来的文件比gzip压缩的大一半,可是这样如故比没有颠末压缩的文件要节减20%-50%的存储空间,这样就可以在服从上大大的进步job执行的速率。

hadoop下lzo设置文档参考

如安在MapReduce中行使压缩

1.输入的文件的压缩

假如输入的文件是压缩过的,那么在被MapReduce读取时,它们会被自动解压,按照文件扩展名来抉择应该行使哪一个压缩解码器。

2.MapReduce功课的输出的压缩

假如要压缩MapReduce功课的输出,请在功课设置文件中将mapred.output.compress属性配置为true。将mapred.output.compression.codec属性配置为本身规划行使的压缩编码/解码器的类名。

假如为输出行使了一系列文件,可以配置mapred.output.compression.type属性来节制压缩范例,默以为RECORD,它压缩单独的记录。将它改为BLOCK,则可以压缩一组记录。因为它有更好的压缩比,以是保举行使。

3.map功课输出功效的压缩

阅读延展

1
3