参考文档:
http://www.haogongju.net/art/1576460
Hadoop经常用于处理大量的数据,如果期间的输出数据、中间数据能压缩存储,对系统的I/O性能会有提升。
综合考虑压缩、解压速度、是否支持split,目前lzo是最好的选择。
下面是具体的安装与配置过程:
1. 安装系统lzo
$ sudo apt-get install liblzo2-2 liblzo2-dev
2. 下载hadoop-lzo的tar包
$ wget -O kevinweil-hadoop-lzo.tar.gz https://nodeload.github.com/kevinweil/hadoop-lzo/tarball/master
3. 编译hadoop-lzo
$ sudo apt-get install gcc ant
$ export JAVA_HOME=/usr/lib/jvm/java-6-sun
$ tar xzvf kevinweil-hadoop-lzo.tar.gz
$ cd kevinweil-hadoop-lzo-6bb1b7f/
$ ant compile-native tar
...
BUILD SUCCESSFUL
Total time: 20 seconds
4. 将编译完成的文件复制到Hadoop中
$ cp build/hadoop-lzo-0.4.15.jar /usr/lib/hadoop-0.20/lib/
$ cp build/native/Linux-amd64-64/lib/libgplcompression.* /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/
5. 重启Hadoop的tasktracker进程
$ sudo /etc/init.d/hadoop-0.20-tasktracker restart
6. 接着,我们就可以在程序中,把输出结果通过lzo进行压缩:
SequenceFileOutputFormat.setOutputCompressionType(job, CompressionType.BLOCK);
SequenceFileOutputFormat.setCompressOutput(job, true);
SequenceFileOutputFormat.setOutputCompressorClass(job, LzoCodec.class);
7. 最后,修改Hadoop配置文件,增加以下参数
$ sudo vim /etc/hadoop-0.20/conf/core-site.xml
02 | < name >io.compression.codecs</ name > |
04 | org.apache.hadoop.io.compress.GzipCodec, |
05 | org.apache.hadoop.io.compress.DefaultCodec, |
06 | org.apache.hadoop.io.compress.BZip2Codec, |
07 | com.hadoop.compression.lzo.LzoCodec, |
08 | com.hadoop.compression.lzo.LzopCodec |
12 | < name >io.compression.codec.lzo.class</ name > |
13 | < value >com.hadoop.compression.lzo.LzoCodec</ value > |
$ sudo vim /etc/hadoop-0.20/conf/mapred-site.xml
02 | < name >mapred.compress.map.output</ name > |
06 | < name >mapred.map.output.compression.codec</ name > |
07 | < value >com.hadoop.compression.lzo.LzoCodec</ value > |
10 | < name >mapred.child.env</ name > |
11 | < value >JAVA_LIBRARY_PATH=/usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/</ value > |
然后重启Hadoop相关进程
$ sudo /etc/init.d/hadoop-0.20-jobtracker restart
$ sudo /etc/init.d/hadoop-0.20-tasktracker restart
$ sudo /etc/init.d/hadoop-0.20-datanode restart
这样Hadoop在读取这些文件时,会自动进行解压。
压缩后的文件大小约为原来的50%,能够比较好的改善Hadoop的I/O性能。