安装环境说明:
本机系统为centos 6.4 64位版、hadoop版本为0.20.2,在此环境下分别安装lzo(lzo-2.06.tar.gz)和hadoop-lzo(hadoop-lzo-master.zip),另外要确保机器安装了ant。本机是在伪分布式下进行安装的,如果是在全分布式下进行安装,只需要在各个datanode节点分别进行相同的安装就可以了。
一、lzo的安装
1.下载lzo-2.06.tar.gz:
http://download.csdn.net/detail/u012875880/6949197
2.解压
tar -zxvf lzo-2.06.tar.gz
3.进入解压后的目录:
cd lzo-2.06
4.编译参数配置:
本例lzo安装在/usr/local/lzo-2.06目录下。
mkdir /usr/local/lzo-2.06
./configure --enable-shared --prefix=/usr/local/lzo-2.06
5.编译并安装:
make && make install
6.进入lzo的安装目录:
cd /usr/local/lzo-2.06
7.将lib目录下的库文件分别拷贝至/usr/lib64目录以及$HADOOP_HOME/lib/native/Linux-amd64-64/下:
cp lib/* /usr/lib64/
cp lib/* $HADOOP_HOME/lib/native/Linux-amd64-64/
注:(1).如果你的机器是32位系统则将库文件分别拷贝到/usr/lib和$HADOOP_HOME/lib/native/Linux-i386-32目录下。
可以通过uname -a查看当前系统位数
(2).lib目录下的库文件将来在使用过程中会被Hadoop(就是Java程序)通过JNI调用(确切的说liblzo*库文件会被后面的libgplcompression*库文件调用,libgplcompression*库文件被才被Java程序直接调用)。
二、hadoop-lzo的安装:
1.下载hadoop-lzo:
可以到http://download.csdn.net/detail/u012875880/6949209进行下载hadoop-lzo-master.zip
2.解压:
unzip hadoop-lzo-master.zip
3.设置环境变量:
vim /etc/profile
export C_INCLUDE_PATH=/usr/local/lzo-2.06/include
export LIBRARY_PATH=/usr/local/lzo-2.06/lib
4.编译java工程:
进入压缩目录:
cd hadoop-lzo-master
ant compile-native tar
编译成功后,会在当前目录下生成一个build目录,里面有我们需要的jar文件以及库文件。
注:如果编译过程中出现
[exec] checking lzo/lzo2a.h presence... no
[exec] checking for lzo/lzo2a.h... no
[exec] configure: error: lzo headers were not found...
[exec] gpl-compression library needs lzo to build.
[exec] Please install the requisite lzo development package.
提示,则说么编译失败,出现这种现象的原因是环境变量没有设置或者设置错误,请参看第3步,设置一下你的环境变量。
如果,编译过程中出现了其他错误情况,请参考官方的FAQ:https://github.com/twitter/hadoop-lzo
5.拷贝生成的build目录下的jar文件到$HADOOP_HOME/lib目录下:
cp build/hadoop-lzo-0.4.15.jar $HADOOP_HOME/lib
6.分别拷贝build目录下的库文件至/usr/lib64目录以及$HADOOP_HOME/lib/native/Linux-amd64-64/下:
cp build/native/Linux-amd64-64/lib/* /usr/lib64
cp build/native/Linux-amd64-64/lib/* $HADOOP_HOME/lib/native/Linux-amd64-64/
注:(1).如果你的机器是32位系统则将库文件分别拷贝到/usr/lib和$HADOOP_HOME/lib/native/Linux-i386-32目录下。
可以通过uname -a查看当前系统位数
(2).lib目录下的库文件将来在使用过程中会被Hadoop(就是Java程序)通过JNI直接调用(而该库文件则会去调用步骤一产生的liblzo*库文件)。
7.更改相关配置文件:(1).core-site.xml文件
io.compression.codecs
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
io.compression.codec.lzo.class
com.hadoop.compression.lzo.LzoCodec
(2).mapred-site.xml文件:
mapred.output.compress
true
mapred.output.compression.codec
com.hadoop.compression.lzo.LzopCodec
mapred.child.env
JAVA_LIBRARY_PATH=/home/zhu/hadoop-0.20.2-cdh3u6/lib/native/Linux-amd64-64
三、lzop安装
1. 下载lzop包:
[root@localhost ~]# wget 'http://www.lzop.org/download/lzop-1.03.tar.gz'
2. 编译安装:
[root@localhost ~]# tar xzvf lzop-1.03.tar.gz
[root@localhost ~]# cd lzop-1.03
[root@localhost lzop-1.03]# ./configure --prefix=/usr/local/lzop-1.03
[root@localhost lzop-1.03]# make
[root@localhost lzop-1.03]#make install
[root@localhost lzop-1.03]# make clean3.添加环境变量:
4.测试:
lzop -version
四、常见错误以及额外说明
1.必须保证你的/usr/lib64和$HADOOP_HOME/lib/native/Linux-amd64-64/目录下有如下库文件:
liblzo2.a liblzo2.la liblzo2.so liblzo2.so.2 liblzo2.so.2.0.0
libgplcompression.a libgplcompression.so libgplcompression.so.0.0.0
libgplcompression.la libgplcompression.so.0
如果缺失,会出如下错误提示:
(1)缺失libgplcompersion*库文件:
14/02/21 14:03:49 ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library
java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at com.hadoop.compression.lzo.GPLNativeCodeLoader.
at com.hadoop.compression.lzo.LzoCodec.
(2).有libgplcompersion*库文件但缺失liblzo*库文件:
14/02/21 02:33:04 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
14/02/21 02:33:04 WARN lzo.LzoCompressor: java.lang.UnsatisfiedLinkError: Cannot load liblzo2.so.2 (liblzo2.so.2: cannot open shared object file: No such file or directory)!
注:注意你的系统的位数及相应的目录。
2.关于hadoop-gpl-compression的说明:
hadoop-lzo-xxx的前身是hadoop-gpl-compression-xxx,之前是放在google code下管理,地址:http://code.google.com/p/hadoop-gpl-compression/ .但由于协议问题后来移植到github上,也就是现在的hadoop-lzo-xxx,github,链接地址:https://github.com/kevinweil/hadoop-lzo.网上介绍hadoop lzo压缩都是基于hadoop-gpl-compression的介绍.而hadoop-gpl-compression还是09年开发的,跟现在hadoop版本已经无法再完全兼容,会发生一些问题。
我安装的hadoop中的lib目录下自带有hadoop-gpl-compression-0.1.0.jar,而我们在上面向$HADOOP_HOME/lib目录下copy过了hadoop-lzo-0.4.15.jar。
这两个jar文件其实是一个东西(如果你查看他们的包结构和api,基本一致),只不过一个是hadoop-gpl-compression对应的老版本的jar,一个是hadoop-lzo对应的新版本的jar。我们必须把他们俩删除一个,我建议删除hadoop-gpl-compression-0.1.0.jar,因为它比较老,和现在的hadoop容易发生不兼容问题。如果不删除,会发生包冲突,hadoop会默认装载使用hadoop-gpl-compression-0.1.0.jar,而我们向$HADOOP_HOME/lib/native/Linux-amd64-64/目录下copy的则是hadoop-lzo对于的库文件(libgplcomperssion*),这样,会发生libgplcomperssion*库文件加载/初始化失败问题,详细错误提示如下:
INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
14/02/21 02:33:04 WARN lzo.LzoCompressor: java.lang.NoSuchFieldError: workingMemoryBuf
14/02/21 02:33:04 ERROR lzo.LzoCodec: Failed to load/initialize native-lzo library
3.关于Java程序通过JNI调用库文件说明:
1.hadoop在运行作业时,会先加载libgplcompression.so*文件,然后再加载liblzo2.so*文件(liblzo2.so*文件由libgplcompression.so*文件调用,而libgplcompression.so*则由Java程序直接调用)
2.当你以本地模式运行hadoop程序时,所依赖的库文件(libgplcompression.so*、liblzo2.so*)全部从/usr/lib64目录下加载,所以你要保证这些文件都放在此目录下。(如果是32为系统,则放在/usr/lib下)
3.当你以非本地模式运行hadoop程序时,hadoop其实是先从$HADOOP_HOME/lib/native/Linux-amd64-64/目录下加载libgplcompression.so*库文件,然后从/usr/lib64目录下加载liblzo2.so*文件。在上面的安装过程中,之所以要求把libgplcompression.so*文件和liblzo2.so*文件在/usr/lib64和$HADOOP_HOME/lib/native/Linux-amd64-64/目录下分别放一份,是为了尽量避免程序运行时库文件的加载问题(呵呵,宁可错杀千人,也不可使一人漏网)。
注:实际调用库文件路径,由你自己安装路径决定。