本文环境介绍:
软件版本备注centos6.5hadoop2.7.12.7.*即可hive2.3.6lzo2.10需要独立安装
LZO是一个无损的数据压缩库,相比于压缩比它更加追求速度。 查阅官网地址:http://www.oberhumer.com/opensource/lzo
http://www.lzop.org 或缺更多有关 LZO的信息 and 查阅压缩数据存储格式 获取有关Hive压缩数据存储信息。
hadoop下各种压缩算法的压缩比,压缩时间,解压时间见下表:
压缩算法 原始文件大小 压缩后的文件大小 压缩速度 解压缩速度
gzip 8.3GB 1.8GB 17.5MB/s 58MB/s
bzip2 8.3GB 1.1GB 2.4MB/s 9.5MB/s
LZO-bset 8.3GB 2GB 4MB/s 60.6MB/s
LZO 8.3GB 2.9GB 49.3MB/S 74.6MB/s
lzo的压缩率不高,但是压缩、解压速度都比较高。
启用lzo的压缩方式对于小规模集群是很有用处,压缩比率大概能降到原始日志大小的1/3。同时压缩和解压缩的速度也比较快。
lzo的官方介绍:
lzo并不是linux系统原生支持,所以需要下载安装软件包。这里至少需要安装3个软件包:lzo, lzop, hadoop-gpl-packaging。
hive lzo官网案例:
假设一个有三列的简单数据文件。
向这个数据文件中插入4条记录:
19630001 john lennon
19630002 paul mccartney
19630003 george harrison
19630004 ringo starr
调用这个数据文件 /home/hivedata/lzodata.txt
.
为了使它成为LZO文件,我们可以使用lzop应用程序,它将创建一个名字类似 lzodata.txt.lzo
的文件。把这个文件拷贝到HDFS中。
要在Hadoop集群中每个节点里安装lzo
和lzop
。安装的细节不在本文档中进行叙述。但是我这里讲解下安装过程。安装lzo和lzop步骤如下:
在hadoop集群每个节点上安装lzo和lzop及其依赖(主要为解决安装lzop):
[root@hadoop01 ~]# yum -y install *lzo* (仅linux使用即可,和hadoop集群并无太大关系)
源码编译安装lzo(因为hadoop-lzo需要编译中的一些 包和扩展.so):
安装准备:
[root@hadoop01 home]# yum -y install gcc-c++ lzo-devel zlib-devel autoconf automake libtool
编译安装:
下载路径:http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
解压下载的源码:
[root@hadoop01 home]# tar -zxvf /home/lzo-2.10.tar.gz
[root@hadoop01 home]# cd /home/lzo-2.10/
[root@hadoop01 lzo-2.10]# ./configure -prefix=/usr/local/lzo/
[root@hadoop01 lzo-2.10]# make
[root@hadoop01 lzo-2.10]# make install
编译hadoop-lzo源码(使用mvn编译):
1、下载源码
https://github.com/twitter/hadoop-lzo/archive/master.zip
2、上传到服务器,并解压,修改pom.xml
[root@hadoop01 home]# unzip /home/hadoop-lzo-master.zip
[root@hadoop01 home]# cd /home/hadoop-lzo-master
编辑pom.xml文件,搜索内容hadoop.current并修改版本号:
2.7.1
3、使用maven编译(默认maven已经安装)
export C_INCLUDE_PATH=/usr/local/lzo/include
export LIBRARY_PATH=/usr/local/lzo/lib
4、编译
[root@hadoop01 hadoop-lzo-master]# mvn package -Dmaven.test.skip=true
5、进入target,将hadoop-lzo-0.4.21-SNAPSHOT.jar放到hadoop的classpath下。如${HADOOP_HOME}/share/hadoop/common
[root@hadoop01 hadoop-lzo-master]# cp ./target/hadoop-lzo-0.4.21-SNAPSHOT.jar /usr/local/hadoop-2.7.1/share/hadoop/common/
分发到其它服务器:
[root@hadoop01 hadoop-lzo-master]# scp ./target/hadoop-lzo-0.4.21-SNAPSHOT.jar hadoop02:/usr/local/hadoop-2.7.1/share/hadoop/common/
hadoop-lzo-0.4.21-SNAPSHOT.jar
[root@hadoop01 hadoop-lzo-master]# scp ./target/hadoop-lzo-0.4.21-SNAPSHOT.jar hadoop03:/usr/local/hadoop-2.7.1/share/hadoop/common/
hadoop-lzo-0.4.21-SNAPSHOT.jar
在core-stie.xml中配置如下,并且同步到每台服务器:
#追加如下内容
io.compression.codecs
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
io.compression.codec.lzo.class
com.hadoop.compression.lzo.LzoCodec
分发到每台服务器:
[root@hadoop01 hadoop-2.7.1]# scp -r ./etc/hadoop/core-site.xml hadoop02:/usr/local/hadoop-2.7.1/etc/hadoop/
[root@hadoop01 hadoop-2.7.1]# scp -r ./etc/hadoop/core-site.xml hadoop03:/usr/local/hadoop-2.7.1/etc/hadoop/
重启hadoop集群:
[root@hadoop01 hadoop-2.7.1]# start-all.sh
CREATE TABLE lzo_test(
id bigint,
firstname string,
lastname string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
;
-- 注意:
报错为:com.hadoop.mapred.DeprecatedLzoTextInputFormat not found....
-- 解决方法:
将hadoop和lzo中间件包放到hadoop的classpath目录即可。
将/home/hivedata/lzodata.txt使用lzop生成.lzo文件:
[root@hadoop01 hivedata]# lzop ./lzodata.txt
LOAD DATA Local INPATH '/home/hivedata/lzodata.txt.lzo' INTO TABLE lzo_test;
LOAD DATA Local INPATH '/home/hivedata/lzodata' INTO TABLE lzo_test;
-- 测试lzo压缩后的数据
hive> select * from lzo_test;
OK
19630001 john lennon
19630002 paul mccartney
19630003 george harrison
19630004 ringo starr
Time taken: 0.097 seconds, Fetched: 4 row(s)
1. 批量lzo文件修改
[root@hadoop01 hivedata]# hadoop jar /usr/local/hadoop-2.7.1/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer /user/hive/warehouse/qf24.db/lzo_test/
2. 单个lzo文件修改
[root@hadoop01 hivedata]# hadoop jar /usr/local/hadoop-2.7.1/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer /user/hive/warehouse/lzo_test/lzodata.txt.lzo
注意:
1、使用mr执行,并且会生成索引文件。
2、lzo本身是不支持split的。故如果需要使用lzo,一般有2种办法:
1)合理控制生成的lzo文件大小,建议不要超过一个block大小。因为如果没有lzo的index文件,该lzo会由一个map处理。如果lzo过大,会导致某个map处理时间过长。
2)配合lzo.index文件使用。好处是文件大小不受限制,可以将文件设置的稍微大点,这样有利于减少文件数目。坏处是生成lzo.index文件本身需要开销。
select id,firstname from lzo_test limit 3;
ALTER TABLE lzo_test SET FILEFORMAT
INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
SERDE "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe";
--注:
更新表的输入为lzo后,则该表下的数据需要是lzo压缩后的,否则查询出来是空或者是报错数据格式不识别。