环境



操作系统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