使hadoop支持Splittable压缩lzo
上一篇 / 下一篇 2009-12-31 18:57:20 / 个人分类:hadoop
查看( 421 ) / 评论( 2 ) / 评分( 0 / 0 )
在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理。这样的特点,就可以让lzo在hadoop上成为一种非常好用的压缩格式。
由于压缩的数据通常只有原始数据的1/4,在HDFS中存储压缩数据,可以使集群能保存更多的数据,延长集群的使用寿命。不仅如此,由于mapreduce作业通常瓶颈都在IO上,存储压缩数据就意味这更少的IO操作,job运行更加的高效。但是,在hadoop上使用压缩也有两个比较麻烦的地方:第一,有些压缩格式不能被分块,并行的处理,比如gzip。第二,另外的一些压缩格式虽然支持分块处理,但是解压的过程非常的缓慢,使job的瓶颈转移到了cpu上,例如bzip2。比如我们有一个1.1GB的gzip文件,该文件被分成128MB/chunk存储在hdfs上,那么它就会被分成9块。为了能够在mapreduce中并行的处理各个chunk,那么各个mapper之间就有了依赖。而第二个mapper就会在文件的某个随机的byte出进行处理。那么gzip解压时要用到的上下文字典就会为空,这就意味这gzip的压缩文件无法在hadoop上进行正确的并行处理。也就因此在hadoop上大的gzip压缩文件只能被一个mapper来单个的处理,这样就很不高效,跟不用mapreduce没有什么区别了。而另一种bzip2压缩格式,虽然bzip2的压缩非常的快,并且甚至可以被分块,但是其解压过程非常非常的缓慢,并且不能被用streaming来读取,这样也无法在hadoop中高效的使用这种压缩。即使使用,由于其解压的低效,也会使得job的瓶颈转移到cpu上去。
如果能够拥有一种压缩算法,即能够被分块,并行的处理,速度也非常的快,那就非常的理想。这种方式就是lzo。lzo的压缩文件是由许多的小的blocks组成(约256K),使的hadoop的job可以根据block的划分来split job。不仅如此,lzo在设计时就考虑到了效率问题,它的解压速度是gzip的两倍,这就让它能够节省很多的磁盘读写,它的压缩比的不如gzip,大约压缩出来的文件比gzip压缩的大一半,但是这样仍然比没有经过压缩的文件要节省20%-50%的存储空间,这样就可以在效率上大大的提高job执行的速度。以下是一组压缩对比数据,使用一个8.0GB的未经过压缩的数据来进行对比:
压缩格式 文件 大小(GB) 压缩时间
解压时间
None
some_logs 8.0 - -
Gzip some_logs.gz 1.3 241 72
LZO some_logs.lzo 2.0 55 35
可以看出,lzo压缩文件会比gzip压缩文件稍微大一些,但是仍然比原始文件要小很多倍,并且lzo文件压缩的速度几乎相当于gzip的5倍,而解压的速度相当于gzip的两倍。lzo文件可以根据block boundaries来进行分块,比如一个1.1G的lzo压缩文件,那么处理第二个128MB block的mapper就必须能够确认下一个block的boundary,以便进行解压操作。lzo并没有写什么数据头来做到这一点,而是实现了一个lzo index文件,将这个文件(foo.lzo.index)写在每个foo.lzo文件中。这个index文件只是简单的包含了每个block在数据中的offset,这样由于offset已知的缘故,对数据的读写就变得非常的快。通常能达到90-100MB/秒,也就是10-12秒就能读完一个GB的文件。一旦该index文件被创建,任何基于lzo的压缩文件就能通过load该index文件而进行相应的分块,并且一个block接一个block的被读取。也因此,各个mapper都能够得到正确的block,这就是说,可以只需要进行一个LzopInputStream的封装,就可以在hadoop的mapreduce中并行高效的使用lzo。如果现在有一个job的InputFormat是TextInputFormat,那么就可以用lzop来压缩文件,确保它正确的创建了index,将TextInputFormat换成LzoTextInputFormat,然后job就能像以前一样正确的运行,并且更加的快。有时候,一个大的文件被lzo压缩过之后,甚至都不用分块就能被单个mapper高效的处理了。
在hadoop集群中安装lzo
要在hadoop中搭建lzo使用环境非常简单:
安装lzop native libraries
例如:sudo yum install lzop lzo2
从如下地址下载 hadoop lzo支持到源代码:http://github.com/kevinweil/hadoop-lzo
编译从以上链接checkout下来到代码,通常为:ant compile-native tar
将编译出来到hadoop-lzo-*.jar部署到hadoop集群到各个slave到某个有效目录下,如$HADOOOP_HOME/lib
将以上编译所得到hadoop-lzo native lib binary部署到集群到某个有效目录下,如$HADOOP_HOME/lib/native/Linux-amd64-64。
将如下配置到 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,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
将如下配置到mapred-site.xml中:
<property>
<name>mapred.child.env</name>
<value>JAVA_LIBRARY_PATH=/path/to/your/native/hadoop-lzo/libs</value>
</property>
如果想要mapreduce再写中间结果时也使用压缩,可以将如下配置也写入到mapred-site.xml中。
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
如果以上所有操作都成功,那么现在就可以尝试使用lzo了。比如打包一个lzo都压缩文件,如lzo_log文件,上传到hdfs中,然后用以下命令进行测试:
hadoop jar /path/to/hadoop-lzo.jar com.hadoop.compression.lzo.LzoIndexer hdfs://namenode:9000/lzo_logs
如果要写一个job来使用lzo,可以找一个job,例如wordcount,将当中到TextInputFormat修改为LzoTextInputForma,其他都不用修改,job就能从hdfs上读入lzo压缩文件,进行分布式都分块并行处理。
http://hi.chinaunix.net/?uid-9976001-action-viewspace-itemid-45130
分享到:
相关推荐
hadoop支持LZO压缩配置 将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-2.7.2/share/hadoop/common/ core-site.xml增加配置支持LZO压缩 <name>io.compression.codecs org.apache.hadoop.io....
Hadoop-LZO是Hadoop生态系统中的一个扩展,它提供了对LZO(一种高效的压缩算法)的支持。LZO是一种快速的压缩算法,适用于实时数据流处理,它能够在低内存占用下实现较高的压缩和解压缩速度。 描述中提到,HDFS...
集成Hadoop-LZO到你的Hadoop环境,你需要将`hadoop-lzo-0.4.21-SNAPSHOT.jar`添加到Hadoop的类路径中,并配置Hadoop的相关参数,例如在`core-site.xml`中设置`io.compression.codecs`属性,指定支持LZO压缩。...
Hadoop LZO,全称为Hadoop对LZO压缩的支持,是由.hadoop项目提供的一个扩展,用于在Hadoop生态系统中高效地压缩和解压缩数据。LZO(Lempel-Ziv-Oberhumer)是一种快速的无损数据压缩算法,它的主要特点是压缩速度快...
hadoop2 lzo 文件 ,编译好的64位 hadoop-lzo-0.4.15.jar 文件 ,在mac 系统下编译的,用法:解压后把hadoop-lzo-0.4.15.jar 放到你的hadoop 安装路径下的lib 下,把里面lib/Mac_OS_X-x86_64-64 下的所有文件 拷到 ...
LZO(Lempel-Ziv-Oberhumer)是一种快速的无损数据压缩算法,常用于大数据处理环境,如Hadoop。在Hadoop中,LZO Codec用于对MapReduce作业的数据进行压缩,可以显著减少网络和磁盘I/O的负载。 LZO代码库的GPL(GNU ...
为了在Hadoop集群中使用Hadoop LZO,用户需要将库文件添加到Hadoop的类路径中,并配置Hadoop的属性,如`io.compression.codecs`和`io.compression.codec.lzo.class`,以启用LZO压缩支持。同时,还需要确保集群中的...
然后,在Hadoop的配置文件中,如core-site.xml或mapred-site.xml,设置相应的参数,如`io.compression.codecs`,以启用LZO压缩支持。 五、性能优化 Hadoop-LZO的性能受到多种因素影响,包括硬件性能、Hadoop集群的...
Hadoop-LZO是针对Apache Hadoop生态系统的LZO压缩支持模块。Hadoop是一个分布式计算框架,广泛用于大数据处理。Hadoop-LZO允许用户在Hadoop集群中使用LZO进行数据压缩,从而提高数据存储和传输效率。Hadoop-LZO项目...
Hadoop-LZO的核心特性是支持Hadoop的块分割,这意味着可以将大文件分割成多个小块进行独立压缩,这在分布式环境中是非常重要的。 文件“lzo-2.06.tar.gz”是LZO源代码的归档文件,通过解压可以获得LZO的源代码,...
hadoop-lzo-0.4.20.jar是这个压缩包中的核心文件,它包含了Hadoop对LZO压缩的支持。这个版本的库可能已经过时,但在理解LZO在Hadoop中的使用时,它仍具有参考价值。这个JAR文件包括了Hadoop与LZO交互所需的类和接口...
编译后的hadoop-lzo源码,将hadoop-lzo-0.4.21-SNAPSHOT.jar放到hadoop的classpath下 如${HADOOP_HOME}/share/hadoop/common。hadoop才能正确支持lzo,免去编译的烦恼
6. 更新Hadoop配置文件(如`core-site.xml`),添加对LZO压缩的支持,指定相关的压缩格式和编码器。 7. 重启Hadoop服务,使新的配置生效。 完成上述步骤后,Hadoop集群就可以使用LZO压缩功能了。在HDFS上存储数据时...
将生成的 build/hadoop-lzo-0.4.15.jar cp 到 /usr/local/hadoop-1.0.2/lib 测试解压程序 bin/hadoop jar /usr/local/hadoop-1.0.2/lib/hadoop-lzo-0.4.15.jar ...
Hadoop支持多种压缩格式,每种格式都有其独特的工具、算法和扩展名,旨在满足不同场景下的需求。以下是几种常用的压缩格式及其特点: - **DEFLATE**: 使用DEFLATE算法,无特定工具,压缩后的文件扩展名为`.deflate`...