LZOP是一种压缩解码器,在MapReduce中可以支持可分块的压缩。第5章中有一节介绍了如何应用LZOP。在这一节中,将介绍如何编译LZOP,在集群做相应配置。
A.10.1 获得更多的信息
表A.12 有用的资源
描述 | URL地址 |
Twitter有关于LZOP的博客文章,包括一些统计信息和安装指南 | http://bit.ly/dfEvGn |
Todd Lipcon的LZO GitHub库。 | https://github.com/toddlipcon/hadoop-lzo |
A.10.2 编译LZOP
在具体步骤之前,需要注意一下几点:
在CDH发行版上安装Hadoop本地库
在Hadoop中运行LZOP依赖于本地库。首先需要设置本地库。这件事在CDH版本中很容易。脚本如下:
$ yum install hadoop-0.20-native.x86_64
以下是安装的结果:
$ rpm -ql hadoop-0.20-native-0.20.2+923.97-1 /usr/lib/hadoop-0.20/lib/native /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64 /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libhadoop.a /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libhadoop.la /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libhadoop.so /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libhadoop.so.1 /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libhadoop.so.1.0.0 /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libsnappy.a /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libsnappy.la /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libsnappy.so /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libsnappy.so.1 /usr/lib/hadoop-0.20/lib/native/Linux-amd64-64/libsnappy.so.1.1.1
在非CDN发行版上安装Hadoop本地库
如果用的是Apache的Hadoop发行版,它已经自带了Linux 32位和64位的本地库。文件位于$HADOOP_HOME/lib/native。对于其它的Hadoop发行版,请咨询供应商如何安装Hadoop本地库。也可以自行通过官方文档编译本地库。文档位于http://hadoop.apache.org/common/docs/r1.0.0/native_libraries.html。
安装LZOP本地库
使用LZOP必须安装LZOP本地库。在RedHat上,脚本如下:
$ yum install liblzo-devel
在CentOS上,必须从http://pkgs.repoforge.org/lzo/下载和操作系统版本架构匹配的lzo-devel的RPM包。
在Hadoop中编译,安装,配置LZOP库
有两个GitHub库维护LZOP库。Todd Lipcon维护一个基于CDH发行版的,在https://github.com/toddlipcon/hadoop-lzo。Twitter维护另一个,在https://github.com/kevinweil/hadoop-lzo。如果需要最新和最好的,用Twitter的那个版本。如果要在CDH发行版上应用,那么就需要Todd的那个版本。
源代码中包含了LZOP的本地库和JAVA库。在下载并解压缩tarball包之后,到相应的目录中编译代码可得到本地库和JAVA库。脚本如下:
$ ant package
在完成以后,将生成的库文件复制到Hadoop的库目录中。脚本如下:
# replace the following path with your actual # Hadoop installation directory # # the following is the CDH Hadoop home dir # export HADOOP_HOME=/usr/lib/hadoop $ cp ./build/hadoop-lzo-<version>.jar $HADOOP_HOME/lib/ $ cp -R build/hadoop-lzo-<version>/lib/native/* \ $HADOOP_HOME/lib/native/
配置Hadoop
下一步,需要配置Hadoop的内核,以加入对新的压缩编码器的支持。将一下行加入到core-site.xml中。CDH中core-site.xml的位置是/etc/hadoop/conf/core-site.xml。确保移出了其中的空行和空格。注意,在逗号之间没有白色字符。
其中,io.compression.codecs的值假定Snappy压缩编码器已经安装了。如果不是,那么就需要将org.apache.hadoop.io.compress.SnappyCodec删除。
<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>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.BZip2Codec, com.hadoop.compression.lzo.LzoCodec, com.hadoop.compression.lzo.LzopCodec, org.apache.hadoop.io.compress.SnappyCodec</value> </property> <property> <name>io.compression.codec.lzo.class</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property>
CDH发行版中/usr/lib/hadoop/bin/hadoop可以自动添加本地库目录到JVM的java.library.path中。但是,如果客户端的Hadoop代码不是用那个脚本运行的话,那么就需要手动添加以下脚本到JAVA的命令行中。注意引号和/usr之间没有空白字符。
-Djava.library.path=/usr/lib/hadoop/lib/native/Linux-amd64-64:/usr/lib64
然后bin/run.sh脚本就可以运行Hadoop脚本。它会将本地库目录加入到java.library.path中。