摘要:
lzo并不是linux系统原生支持,所以需要下载安装软件包。这里至少需要安装3个软件包:lzo, lzop, hadoop-gpl-packaging。gpl-packaging的作用主要是对压缩的lzo文件创建索引,否则的话,无论压缩文件是否大于hdfs的block大小,都只会按照默认启动2个map操作。
一、安装lzop native library
> wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
> tar -zxvf lzo-2.06.tar.gz
> cd lzo-2.06
> export CFLAGS=-m64
> ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/
> make && sudo make install
编译完lzo包之后,会在/usr/local/hadoop/lzo/生成一些文件。
将/usr/local/hadoop/lzo目录下的所有文件打包,并同步到集群中的所有机器上。
在编译lzo包的时候,需要一些环境,可以用下面的命令安装好lzo编译环境
yum -y install lzo-devel zlib-devel gcc autoconf automake libtool
二、安装hadoop-lzo
> wget https://github.com/twitter/hadoop-lzo/archive/master.zip
> unzip master
解压后的文件夹名为hadoop-lzo-master。
hadoop-lzo中的pom.xml依赖了hadoop2.1.0-beta,由于我们这里用到的是Hadoop 2.6.0,所以建议将hadoop版本修改为2.6.0:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.current.version>2.6.0</hadoop.current.version>
<hadoop.old.version>1.0.4</hadoop.old.version>
</properties>
然后进入hadoop-lzo-master目录,依次执行下面的命令
# export CFLAGS=-m64
# export CXXFLAGS=-m64
# export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include
# export LIBRARY_PATH=/usr/local/hadoop/lzo/lib
# mvn clean package -Dmaven.test.skip=true
# cd target/native/Linux-amd64-64
# tar -cBf - -C lib . | tar -xBvf - -C ~
# cp ~/libgplcompression* $HADOOP_HOME/lib/native/
# cp target/hadoop-lzo-0.4.18-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/
其实在tar -cBf – -C lib . | tar -xBvf – -C ~命令之后,会在~目录下生成一下几个文件:
# ls -l
-rw-r--r-- 1 libgplcompression.a
-rw-r--r-- 1 libgplcompression.la
lrwxrwxrwx 1 libgplcompression.so -> libgplcompression.so.0.0.0
lrwxrwxrwx 1 libgplcompression.so.0 -> libgplcompression.so.0.0.0
-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。
四、lzop的安装
lzop是lzo压缩解压的工具,你可以使用lzop file 来压缩文件成lzo文件,也可以使用lzop -d file.lzo来解压lzo文件
# wget www.lzop.org/download/lzop-1.04.tar.gz
# tar zxf lzop-1.04.tar.gz
# cd lzop-1.04
# /configure
# make && make install
然后查看版本信息,是否安装正确。
lzop -V
五、用wordcount验证lzo
默认情况下,lzo是不支持分片的。即不管单个数据文件有多大,都只有一个map去执行任务。这样满足不了分布式计算的需求。要支持分片,需要先将数据文件进行索引操作。
hadoop jar hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.LzoIndexer /user/hadoop/wc/input/result.txt.lzo
执行完毕后,我们可以在HDFS目录上看见多了一个索引文件
[hadoop@hadoop001 app]$ hadoop fs -ls /user/hadoop/wc/input
Found 2 items
-rw-r--r-- 1 hadoop supergroup 778853259 2018-12-11 09:20 /user/hadoop/wc/input/result.txt.lzo
-rw-r--r-- 1 hadoop supergroup 26328 2018-12-11 09:22 /user/hadoop/wc/input/result.txt.lzo.index
[hadoop@hadoop001 app]$
然后我们执行Hadoop自带的wc程序测试
hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /user/hadoop/wc/input /user/hadoop/wc/output
测试完成。