hadoop-lzo 安装教程

来源:互联网 发布:菜单设计制作软件 编辑:程序博客网 时间:2024/04/30 02:23
环境
操作系统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 $HADOOP_HOME/lib/  
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-64

export 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)如果使用 LzoCodec作为Reduce输出,则输出文件扩展名为".lzo_deflate",它无法被lzop读取;如果使用LzopCodec作为Reduce输出,则扩展名为".lzo",它可以被lzop读取

3)生成lzo index job的"DistributedLzoIndexer"无法为 LzoCodec即 ".lzo_deflate"扩展名的文件创建index

4)".lzo_deflate"文件无法作为MapReduce输入,".LZO"文件则可以。

5)综上所述得出最佳实践:map输出的中间数据使用 LzoCodec,reduce输出使用 LzopCodec


9.参考资料
http://blog.csdn.net/joe_007/article/details/7852173
http://hi.baidu.com/qingchunranzhi/item/72155fd1ccf5e05bd73aaebc
http://blog.sina.com.cn/s/blog_7673d4a50101b3yy.html

0 0
原创粉丝点击