环境
操作系统Ubuntu 12.04 64位
JDK 1.7
gcc 4.6.3
所需软件包
gcc、ant、lzo、lzo编码/解码器、lzo-devel依赖(lzo-2.06-1.el5.rf.x86_64.rpm、lzo-devel-2.06-1.el5.rf.x86_64.rpm)
概要步骤
1.安装和更新gcc、ant
2.在各个节点安装lzo
3.安装lzo编码/解码器
4.修改配置文件,并同步各节点的配置文件
注:没有特别指出的话,所有操作都是在Namenode中进行的
具体步骤
1.安装ant
到官网下载ant,网址:http://ant.apache.org/bindownload.cgi
下载得到apache-ant-1.9.3-bin.tar.gz
解压安装包
tar -jxvf apache-ant-1.9.3-bin.tar.gz
配置ant的环境变量
sudo gedit /etc/profile
export ANT_HOME=/usr/local/apache-ant-1.9.3
export PATH=$PATH:$ANT_HOME/bin
source /etc/profile ;使配置文件生效
2.安装lzo
到官网下载lzo,网址:http://www.oberhumer.com/opensource/lzo/download/
下载得到lzo-2.06.tar.gz
解压并安装
tar -zxvf lzo-2.06.tar.gz
cd lzo-2.06
./configure --enable-shared
make
make install
库文件被默认安装到了/usr/local/lib,我们需要进一步指定lzo库文件的路径,两个方法都可以:
1)拷贝/usr/local/lib目录下的lzo库文件到/usr/lib(32位平台),或/usr/lib64(64位平台)
2)在/etc/ld.so.conf.d/目录下新建lzo.conf文件,写入lzo库文件的路径,然后运行/sbin/ldconfig -v,使配置生效
本人使用的是第1种方法
3.在各节点安装lzo
这句话本可以一笔带过,但我把它单独列出作为一步,就是要提醒大家:Namenode和Datanode都要安装lzo!
4.安装lzo编码/解码器
安装lzo-devel依赖
lzo-devel依赖包括2个文件:lzo-2.06-1.el5.rf.x86_64.rpm、lzo-devel-2.06-1.el5.rf.x86_64.rpm
下载网址:http://pkgs.repoforge.org/lzo/
注意下载对应的32位、64位安装包
本人使用的是lzo-2.06-1.el5.rf.x86_64.rpm、lzo-devel-2.06-1.el5.rf.x86_64.rpm
由于本人使用的是Ubuntu,不能直接用.rpm,所以这里需要用一个工具——alien来做一下格式转换
sudo apt-get install alien
cd /path/to/your/lzo-devel-dependence/
sudo alien lzo*.rpm
到这里便转换成功,双击2个.deb安装包安装即可
下载lzo编码/解码器
这里必须要说明:如果hadoop是cloudera版的,那么lzo编码/解码器就不要用google官方的那个!那个版本太低!
下载网址:https://github.com/kevinweil/hadoop-lzo
本人使用的是kevinweil-hadoop-lzo-6bb1b7f.zip
解压、编译lzo编码/解码器
tar-zxvf kevinweil-hadoop-lzo-6bb1b7f.zip
这里也可以直接右键、解压到此处,本人使用的是这种方法
/*****************************************************************************
*2013-01-16
*今天在别的机器上安装时,发现用tar命令或者右键解压的方式都会出现问题
*用以上两种方式的话,在后面ant compile-native tar的时候
*会出现无法找到kevinweil-hadoop-lzo-6bb1b7f/ivy/ivy-2.2.0.jar的错误
*事实上这个ivy-2.2.0.jar是存在的,但却找不到了
*想到有可能是压缩包出问题了,就用tar、gzip、zip分别测试了下kevinweil-hadoop-lzo-6bb1b7f.zip
*发现tar、gzip在测试过程中都出现错误,只有zip没错
*因此我用unzip命令重新解压kevinweil-hadoop-lzo-6bb1b7f.zip
*于是之后ant compile-native tar的时候就再也没出错了
*********************************************************************/
cd kevinweil-hadoop-lzo-6bb1b7f
export CFLAGS=-m64 ;32位系统应该是:export CFLAGS=-m32
export CXXFALGS=-m64 ;32位系统应该是:export CXXFLAGS=-m32
ant compile-native tar
本来到这里应该编译成功,并且在编译得到的build文件夹里便可看到hadoop-lzo-0.4.15.jar
但是本人遇到了以下问题
a. compile-java:
[javac] /data/hadoop-lzo-master/build.xml:243: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
check-native-uptodate:
compile-native:
[javah] 错误: 找不到类org.apache.hadoop.conf.Configuration。
BUILD FAILED
/data/hadoop-lzo-master/build.xml:269: compilation failed
解决方法:
kevinweil-hadoop-lzo-6bb1b7f/build.xml 里面(Ctrl+F compile-java可迅速定位)
<target name="compile-java" depends="init">
<javac
encoding="${build.encoding}"
srcdir="${java.src.dir}"
includes="**/*.java"
destdir="${build.classes}"
debug="${javac.debug}"
optimize="${javac.optimize}"
target="${javac.version}"
source="${javac.version}"
deprecation="${javac.deprecation}">
<compilerarg line="${javac.args} ${javac.args.warnings}" />
<classpath refid="classpath"/>
</javac>
<copy todir="${build.classes}">
<fileset dir="${java.src.dir}" includes="**/*.properties"/>
</copy>
</target>加入一行
<target name="compile-java" depends="init">
<javac includeantruntime="false"
encoding="${build.encoding}"
srcdir="${java.src.dir}"
includes="**/*.java"
destdir="${build.classes}"
debug="${javac.debug}"
optimize="${javac.optimize}"
target="${javac.version}"
source="${javac.version}"
deprecation="${javac.deprecation}">
<compilerarg line="${javac.args} ${javac.args.warnings}" />
<classpath refid="classpath"/>
</javac>
<copy todir="${build.classes}">
<fileset dir="${java.src.dir}" includes="**/*.properties"/>
</copy>
</target>b. compile-native:
[javah] 错误: 找不到类org.apache.hadoop.conf.Configuration。
BUILD FAILED
/data/hadoop-lzo-master/build.xml:270: compilation failed解决方法:
kevinweil-hadoop-lzo-6bb1b7f/build.xml 里面将(Ctrl+F javah可迅速定位)
<javah classpath="${build.classes}"
destdir="${build.native}/src/com/hadoop/compression/lzo"
force="yes"
verbose="yes">
<class name="com.hadoop.compression.lzo.LzoCompressor" />
<class name="com.hadoop.compression.lzo.LzoDecompressor" />
</javah>
加入一行 <javah classpath="${build.classes}"
destdir="${build.native}/src/com/hadoop/compression/lzo"
force="yes"
verbose="yes">
<class name="com.hadoop.compression.lzo.LzoCompressor" />
<class name="com.hadoop.compression.lzo.LzoDecompressor" />
<classpath refid="classpath" />
</javah>
修改好build.xml之后,再执行一次
ant compile-native tar
这次终于编译成功!在编译得到的build文件夹里便可看到hadoop-lzo-0.4.15.jar
编译成功后,还需要把编码/解码器以及native库拷贝到$HADOOP_HOME/lib目录下,
cp build/hadoop-lzo-0.4.15.jar
tar -cBf - -C build/native . | tar -xBvf - -C $HADOOP_HOME/lib/native
cd $HADOOP_HOME/lib/
rm hadoop-gpl-compression-0.1.0.jar
cd /path/to/your/kevinweil-hadoop-lzo-6bb1b7f/build/native/Linux-amd64-64/lib
sudo cp * $HADOOP_HOME/lib/native/Linux-amd64-64
chown -R hadoop:hadoop $HADOOP_HOME/lib/
5.修改hadoop配置文件
a.在hadoop-env.sh 添加,修改 这两行
[hadoop@master bin]$ cd /opt/modules/hadoop/hadoop-1.0.3/conf
#Lzo,Snappy,gzip 等压缩算法库地址
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native/Linux-amd64-64export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_CLASSPATH/hadoop-lzo-0.4.15.jar
b.在core-site.xml中添加
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>c.在mapred-site.xml中添加
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
<!-- map 和 reduce 输出中间文件默认开启压缩 -->
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
<!-- 使用 Lzo 库作为压缩算法 -->
</property>
d.同步各节点的配置文件
6.安装lzop
下载lzop安装包,
下载网址:http://www.lzop.org/download/
本人使用的是lzop-1.03.tar.gz
tar -zxvf lzop-1.03.tar.gz
cd lzop-1.03
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
./configure
make
make install
7.测试
cd $HADOOP_HOME
hadoop fs -put test.txt /user/hadoop/test/
运行结果中,如果出现
lzo.GPLNativeCodeLoader: Loaded native gpl library
则说明安装成功
8.使用说明
使用LZO过程会发现它有两种压缩编码可以使用,即LzoCodec和LzopCodec,下面说说它们区别:
1)LzoCodec比LzopCodec更快, LzopCodec为了兼容LZOP程序添加了如 bytes signature, header等信息
2)如果使用
3)生成lzo index job的"DistributedLzoIndexer"无法为 LzoCodec即 ".lzo_deflate"扩展名的文件创建index
4)".lzo_deflate"文件无法作为MapReduce输入,".LZO"文件则可以。
5)综上所述得出最佳实践:map输出的中间数据使用 LzoCodec,reduce输出使用 LzopCodec
9.参考资料
http://hi.baidu.com/qingchunranzhi/item/72155fd1ccf5e05bd73aaebc
http://blog.sina.com.cn/s/blog_7673d4a50101b3yy.html