Hadoop处理大量的数据,如果期间的输出数据、中间数据能压缩存储,对系统的I/O性能会有提升。
参考了网上不少资料,发现综合考虑压缩、解压速度、是否支持split,目前lzo是最好的选择。lzo最初在google code上托管,但后来转移到github了,所以以github为准。地址为:
https://github.com/kevinweil/hadoop-lzo
步骤如下:
1. 安装lzo
我的是centos,所以yum search lzo后,安装对应版本的devel包。
2. 到github下载hadoop-lzo的tar包安装
https://github.com/kevinweil/hadoop-lzo/downloads
准备条件:编译hadoop-lzo得有gcc、ant
解压后,到hadoop-lzo目录下,运行:
ant compile-native tar
原无意外的话,就会生成hadoop-lzo-0.4.15.jar
3. 把hadoop-lzo-0.4.15.jar拷贝到hadoop的lib目录下,此外把
hadoop-lzo/build/native/Linux-amd64-64/lib下的.a、.la、so等文件拷贝到hadoop的lib/native/Linux-amd64-64下,之后重启hadoop
那么就可以在程序中,把输出结果通过lzo压缩:
SequenceFileOutputFormat.setOutputCompressionType(job, CompressionType.BLOCK);
SequenceFileOutputFormat.setCompressOutput(job, true);
SequenceFileOutputFormat.setOutputCompressorClass(job, LzoCodec.class);
hadoop读取这些文件时,会自动解压。
hadoop上比较好的压缩库,都是native方式,配置起来挺麻烦的。
配置过程中,就老提示:Could not load native gpl library
文件该复制都复制了,最终的解决办法是在eclipse中,右击项目--build path,选择libraries--点击hadoop-lzo-0.4.15.jar,展开后,双击其下的:Native library location,选择编译好的hadoop-lzo的native文件所在路径,我填的是:
hadoop-lzo/build/native/Linux-amd64-64/lib
发现压缩后的文件大概为原来的50%。
最后,附上官方的hadoop—lzo配置说明:
https://github.com/kevinweil/hadoop-lzo/blob/master/README.md
http://code.google.com/a/apache-extras.org/p/hadoop-gpl-compression/wiki/FAQ?redir=1
--------------------------------------------------------------------
补充:在red hat 4下,yum install的是1.0版本的lzo,要升级成ver 2的才行。下载rpm包安装:
wget ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el4/en/x86_64/dag/RPMS/lzo-2.04-1.el4.rf.x86_64.rpm
wget ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el4/en/x86_64/dag/RPMS/lzo-devel-2.04-1.el4.rf.x86_64.rpm
rpm -ivh lzo-2.04-1.el4.rf.x86_64.rpm
rpm -ivh lzo-devel-2.04-1.el4.rf.x86_64.rpm
详情请参考这位xd的文章:
http://blog.csdn.net/kalaamong/article/details/7275185