【转自】http://my.oschina.net/u/1169079/blog/225070

经常用于处理大量的数据,如果期间的输出数据、中间数据能压缩存储,对系统的I/O性能会有提升。综合考虑压缩、解压速度、是否支持split,目前lzo是最好的选择。LZO(LZO是Lempel-Ziv-Oberhumer的缩写)是一种高压缩比和解压速度极快的编码,它的特点是解压缩速度非常快,无损压缩,压缩后的数据能准确还原,lzo是基于block分块的,允许数据被分解成chunk,能够被并行的解压。LZO库实现了许多有下述特点的算法:
  (1)、解压简单,速度非常快。
  (2)、解压不需要内存。
  (3)、压缩相当地快。
  (4)、压缩需要64 kB的内存。
  (5)、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。
  (6)、包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。
  (7)、另外还有一个只需要8 kB内存的压缩级别。
  (8)、算法是线程安全的。
  (9)、算法是无损的。
本文针对Hadoop 2.2.0,介绍如何安装和使用lzo。

一、下载、解压并编译lzo包

 
1 [wyp@master ~]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
2 [wyp@master ~]$ tar -zxvf lzo-2.06.tar.gz
3 [wyp@master ~]$ cd lzo-2.06
4 [wyp@master ~]$ export CFLAGS=-m64
5 [wyp@master ~]$ ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/
6 [wyp@master ~]$ make && sudo make install

  编译完lzo包之后,会在/usr/local/hadoop/lzo/生成一些文件,目录结构如下:

 
1 [wyp@master /usr/local/hadoop/lzo]$ ls -l
2 total 12
3 drwxr-xr-x 3 root root 4096 Mar 21 17:23 include
4 drwxr-xr-x 2 root root 4096 Mar 21 17:23 lib
5 drwxr-xr-x 3 root root 4096 Mar 21 17:23 share

  将/usr/local/hadoop/lzo目录下的所有文件打包,并同步到集群中的所有机器上。

  在编译lzo包的时候,需要一些环境,可以用下面的命令安装好lzo编译环境

1 [wyp@master ~]$ yum -y install  lzo-devel     \
2                zlib-devel  gcc autoconf automake libtool

二、安装Hadoop-LZO

  这里下载的是Twitter hadoop-lzo,可以用Maven(如何安装Maven请参照本博客的《Linux命令行下安装Maven与配置》)进行编译。

1 [wyp@master ~]$ wget https://github.com/twitter/hadoop-lzo/archive/master.zip

下载后的文件名是master,它是一个zip格式的压缩包,可以进行解压:

1 [wyp@master ~]$ unzip master

解压后的文件夹名为hadoop-lzo-master

  当然,如果你电脑安装了git,你也可以用下面的命令去下载

1 [wyp@master ~]$ git clone https://github.com/twitter/hadoop-lzo.git

hadoop-lzo中的pom.xml依赖了hadoop2.1.0-beta,由于我们这里用到的是Hadoop 2.2.0,所以建议将hadoop版本修改为2.2.0:

1 <properties>
2     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3     <hadoop.current.version>2.2.0</hadoop.current.version>
4     <hadoop.old.version>1.0.4</hadoop.old.version>
5   </properties>

然后进入hadoop-lzo-master目录,依次执行下面的命令

01 [wyp@master hadoop-lzo-master]$ export CFLAGS=-m64
02 [wyp@master hadoop-lzo-master]$ export CXXFLAGS=-m64
03 [wyp@master hadoop-lzo-master]$ export C_INCLUDE_PATH=     \
04                                   /usr/local/hadoop/lzo/include
05 [wyp@master hadoop-lzo-master]$ export LIBRARY_PATH=/usr/local/hadoop/lzo/lib
06 [wyp@master hadoop-lzo-master]$ mvn clean package -Dmaven.test.skip=true
07 [wyp@master hadoop-lzo-master]$ cd target/native/Linux-amd64-64
08 [wyp@master Linux-amd64-64]$ tar -cBf - -C lib . | tar -xBvf - -C ~
09 [wyp@master ~]$cp ~/libgplcompression* $HADOOP_HOME/lib/native/
10 [wyp@master hadoop-lzo-master]$cp target/hadoop-lzo-0.4.18-SNAPSHOT.jar   \
11                                    $HADOOP_HOME/share/hadoop/common/

其实在tar -cBf – -C lib . | tar -xBvf – -C ~命令之后,会在~目录下生成一下几个文件:

1 [wyp@master ~]$ ls -l
2 -rw-r--r--  1 libgplcompression.a
3 -rw-r--r--  1 libgplcompression.la
4 lrwxrwxrwx  1 libgplcompression.so -> libgplcompression.so.0.0.0
5 lrwxrwxrwx  1 libgplcompression.so.0 -> libgplcompression.so.0.0.0
6 -rwxr-xr-x  1 libgplcompression.so.0.0.0

  其中libgplcompression.so和libgplcompression.so.0是链接文件,指向libgplcompression.so.0.0.0,将刚刚生成的libgplcompression*和target/hadoop-lzo-0.4.18-SNAPSHOT.jar同步到集群中的所有机器对应的目录。

三、配置Hadoop环境变量

  1、在Hadoop中的$HADOOP_HOME/etc/hadoop/hadoop-env.sh加上下面配置:

1 export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib

  2、在$HADOOP_HOME/etc/hadoop/core-site.xml加上如下配置:

01 <property>
02     <name>io.compression.codecs</name>
03     <value>org.apache.hadoop.io.compress.GzipCodec,
04            org.apache.hadoop.io.compress.DefaultCodec,
05            com.hadoop.compression.lzo.LzoCodec,
06            com.hadoop.compression.lzo.LzopCodec,
07            org.apache.hadoop.io.compress.BZip2Codec
08         </value>
09 </property>
10  
11 <property>
12     <name>io.compression.codec.lzo.class</name>
13     <value>com.hadoop.compression.lzo.LzoCodec</value>
14 </property>

  3、在$HADOOP_HOME/etc/hadoop/mapred-site.xml加上如下配置

01 <property>
02     <name>mapred.compress.map.output</name>
03     <value>true</value>
04 </property>
05  
06 <property>
07     <name>mapred.map.output.compression.codec</name>
08     <value>com.hadoop.compression.lzo.LzoCodec</value>
09 </property>
10  
11 <property>
12     <name>mapred.child.env</name>
13     <value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value>
14 </property>

  将刚刚修改的配置文件全部同步到集群的所有机器上,并重启Hadoop集群,这样就可以在Hadoop中使用lzo。

四、如何使用

  这里在Hive中使用一下lzo,在hive中创建一个lzo表:

1 hive> create table lzo(
2     > id int,
3     > name string)
4     > STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
5     > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
6 OK
7 Time taken: 3.423 seconds
如果在创建lzo表出现了如下错误:

1 FAILED: Error in metadata: Class not found:     \
2                   com.hadoop.mapred.DeprecatedLzoTextInputFormat
3 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

请检查你的环境是否配置好。

然后在本地用lzo压缩一个文件,先看看users.txt的内容:

01 [wyp@master ~]$ cat users.txt
02 1^Awyp
03 2^Azs
04 3^Als
05 4^Aww
06 5^Awyp2
07 6^Awyp3
08 7^Awyp4
09 8^Awyp5
10 9^Awyp6
11 10^Awyp7
12 11^Awyp8
13 12^Awyp5
14 13^Awyp9
15 14^Awyp20
16 [wyp@master ~]$ lzop users.txt
17 [wyp@master ~]$ ls -l users.txt*
18 -rw-r--r-- 1 wyp wyp 97  Mar 25 15:40 users.txt
19 -rw-r--r-- 1 wyp wyp 154 Mar 25 15:40 users.txt.lzo

将users.txt.lzo的数据导入到lzo表里面:

 
01 hive> load data local inpath '/home/wyp/users.txt.lzo' into table lzo;
02 Copying data from file:/home/wyp/users.txt.lzo
03 Copying file: file:/home/wyp/users.txt.lzo
04 Loading data to table default.lzo
05 Table default.lzo stats: [num_partitions: 0, num_files: 1,
06                num_rows: 0, total_size: 154, raw_data_size: 0]
07 OK
08 Time taken: 0.49 seconds
09 hive> select * from lzo;
10 OK
11 1   wyp
12 2   zs
13 3   ls
14 4   ww
15 5   wyp2
16 6   wyp3
17 7   wyp4
18 8   wyp5
19 9   wyp6
20 10  wyp7
21 11  wyp8
22 12  wyp5
23 13  wyp9
24 14  wyp20
25 Time taken: 0.244 seconds, Fetched: 14 row(s)

好了,我们可以在Hadoop中使用lzo了!!(完)

最新文章

  1. 【笔记】Service的使用
  2. 文本编辑器的使用(ckeditor/ueditor)
  3. Oracle数据库面试题【转载】
  4. C# 读写ini文件
  5. 同程旅游网开放平台SDK开发完成
  6. Myeclipse里导入jQuery.js 时出现错误打红叉的解决方法
  7. Find K most Frequent items in array
  8. 关联规则算法Apriori的学习与实现
  9. Python 正则表达试
  10. hdu2817之整数快速幂
  11. code 代码分析 及其解决方案
  12. Web开发者的10个最好的云开发环境
  13. Web Api Route 注册要放在 Mvc Route 注册前
  14. AngularJS 实现按需异步加载
  15. js_4_函数
  16. java常用字节流
  17. (Tomcat)服务器之web应用的虚拟目录映射和主机搭建
  18. Java多线程9:中断机制
  19. jQuery使用CDN加速
  20. SDN2017 第二次作业

热门文章

  1. shell脚本中的几个括号总结(小括号/大括号/花括号)
  2. 在Ubuntu下设置默认编辑器
  3. 记录规则 &ndash; 销售只能看到自己的客户,经理可以看到全部
  4. XMPP serverejabberd-14.12本地搭建
  5. jquery toastmessage (Jquery类似安卓消息提示框)
  6. IP共享重新验证
  7. java获取某个范围内的一个随机数
  8. try语句...
  9. 【LeetCode】146. LRU Cache
  10. X-Forwarded-For的一些理解