转自 http://blog.csdn.net/joseph_happy/article/details/50374057
简介
- 启用lzo
启用lzo的压缩方式对于小规模集群是很有用处,压缩比率大概能降到原始日志大小的1/3。同时解压缩的速度也比较快。
- 安装lzo
lzo并不是linux系统原生支持,所以需要下载安装软件包。这里至少需要安装3个软件包:lzo, lzop, hadoop-gpl-packaging。
- 增加索引
gpl-packaging的作用主要是对压缩的lzo文件创建索引,否则的话,无论压缩文件是否大于hdfs的block大小,都只会按照默认启动2个map操作。
部署
安装lzop native library
[root@localhost ~]# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
[root@localhost ~]# tar -zxvf lzo-2.06.tar.gz
[root@localhost ~]# cd lzo-2.06
[root@localhost ~]# export CFLAGS=-m64
[root@localhost ~]# ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/
[root@localhost ~]# make && sudo make install
编译完lzo包之后,会在/usr/local/hadoop/lzo/生成一些文件。
将/usr/local/hadoop/lzo目录下的所有文件打包,并同步到集群中的所有机器上。
在编译lzo包的时候,需要一些环境,可以用下面的命令安装好lzo编译环境
[root@localhost ~]# yum -y install lzo-devel zlib-devel gcc autoconf automake libtool
安装hadoop-lzo
这里下载的是Twitter hadoop-lzo,可以用Maven(如何安装Maven请参照本博客的《Linux命令行下安装Maven与配置》)进行编译。
[root@localhost ~]# wget https://github.com/twitter/hadoop-lzo/archive/master.zip
下载后的文件名是master,它是一个zip格式的压缩包,可以进行解压:
[root@localhost ~]# unzip master
解压后的文件夹名为hadoop-lzo-master
当然,如果你电脑安装了git,你也可以用下面的命令去下载
[root@localhost ~]# git clone https://github.com/twitter/hadoop-lzo.git
hadoop-lzo中的pom.xml依赖了hadoop2.1.0-beta,由于我们这里用到的是Hadoop 2.2.0,所以建议将hadoop版本修改为2.2.0:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.current.version>2.2.0</hadoop.current.version>
<hadoop.old.version>1.0.4</hadoop.old.version>
</properties>
PS:在安装的时候不知道为何修改之后会打包失败,不修改默认的版本就不会失败。失败的朋友可以试试不修改版本,直接进行打包操作
然后进入hadoop-lzo-master目录,依次执行下面的命令
[root@localhost ~]# export CFLAGS=-m64
[root@localhost ~]# export CXXFLAGS=-m64
[root@localhost ~]# export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include
[root@localhost ~]# export LIBRARY_PATH=/usr/local/hadoop/lzo/lib
[root@localhost ~]# mvn clean package -Dmaven.test.skip=true
[root@localhost ~]# cd target/native/Linux-amd64-64
[root@localhost ~]# tar -cBf - -C lib . | tar -xBvf - -C ~
[root@localhost ~]# cp ~/libgplcompression* $HADOOP_HOME/lib/native/
[root@localhost ~]# cp target/hadoop-lzo-0.4.18-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/
其实在tar -cBf – -C lib . | tar -xBvf – -C ~命令之后,会在~目录下生成一下几个文件:
[root@localhost ~]# ls -l
1-rw-r--r-- 1 libgplcompression.a
2-rw-r--r-- 1 libgplcompression.la
3lrwxrwxrwx 1 libgplcompression.so -> libgplcompression.so.0.0.0
4lrwxrwxrwx 1 libgplcompression.so.0 -> libgplcompression.so.0.0.0
5-rwxr-xr-x 1 libgplcompression.so.0.0.0
其中libgplcompression.so和libgplcompression.so.0是链接文件,指向libgplcompression.so.0.0.0,将刚刚生成的libgplcompression*和target/hadoop-lzo-0.4.18-SNAPSHOT.jar同步到集群中的所有机器对应的目录。
配置hadoop环境变量
1、在Hadoop中的$HADOOP_HOME/etc/hadoop/hadoop-env.sh加上下面配置:
export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib
2、在$HADOOP_HOME/etc/hadoop/core-site.xml加上如下配置:
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.BZip2Codec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
3、在$HADOOP_HOME/etc/hadoop/mapred-site.xml加上如下配置
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<property>
<name>mapred.child.env</name>
<value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value>
</property>
将刚刚修改的配置文件全部同步到集群的所有机器上,并重启Hadoop集群,这样就可以在Hadoop中使用lzo。
测试Hadoop lzo
1. hadoop-2.8.5/bin/hadoop jar hadoop-2.8.5/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer /count/input/xxx.lzo
1.1 第一个部分(hadoop-2.8.5/bin/hadoop)是hadoop的命令,位于bin目录下。
1.2 第二个部分jar命令,标识是执行MapReduce的jar包任务
1.3 第三个部分是(hadoop-2.8.5/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar),是标识执行哪个jar包。
1.4 第四部分(com.hadoop.compression.lzo.DistributedLzoIndexer) 标识是运行哪个主类
1.5 第五部分(/count/input/xxx.lzo)(lzo文件可以使用lzop命令压缩文件得到) 是标识对哪个文件创建索引。