hive LZO压缩

hive LZO压缩

本文环境介绍:

软件 版本 备注
centos 6.5
hadoop 2.7.1 2.7.*即可
hive 2.3.6
lzo 2.10 需要独立安装

1 lzo压缩

1.1 lzo的简介

1.1.1 lzo定义

LZO 是致力于解压速度的一种数据压缩算法,相比于压缩比它更加追求速度,LZO 是 Lempel-Ziv-Oberhumer 的缩写。
这个算法是无损算法,参考实现程序是线程安全的。 实现它的一个自由软件工具是lzop。
lzo最初的库是用 ANSI C 编写、并且遵从 GNU通用公共许可证发布的。
LZO 有用于 Perl、Python 以及 Java 的各种版本。

1.1.2 lzo和lzop官方介绍

lzo并不是linux系统原生支持,所以需要下载安装软件包。这里至少需要安装3个软件包:lzo, lzop, hadoop-gpl-packaging。


lzo地址:http://www.oberhumer.com/opensource/lzo 
lzop官网地址:http://www.lzop.org

在这里插入图片描述

1.1.3 lzo的特点

-- 解压简单,速度非常快。
-- 解压不需要内存。
-- 压缩相当地快。
-- 压缩需要 64 kB 的内存。
-- 允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。
-- 包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。
-- 另外还有一个只需要 8 kB 内存的压缩级别。
-- 算法是线程安全的。
-- 算法是无损的。
-- LZO 支持重复压缩以及原地解压。
-- LZO 是块压缩算法——压缩解压成块的数据。压缩与解压所用块的大小必须一样。

1.1.4 启用lzo

启用lzo的压缩方式对于小规模集群是很有用处,压缩比率大概能降到原始日志大小的1/3。同时压缩和解压缩的速度也比较快。

1.1.5 hadoop下各种压缩算法比率

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的压缩率不是很高,但是压缩、解压速度都比较高。

1.1.6 hive lzo官网案例

假设一个有三列的简单数据文件。

  • id
  • first name
  • last name

向这个数据文件中插入4条记录:

19630001	john	lennon
19630002	paul	mccartney
19630003	george	harrison
19630004	ringo	starr

调用这个数据文件 /home/hivedata/lzodata.txt.

为了使它成为LZO文件,我们可以使用lzop应用程序,它将创建一个名字类似 lzodata.txt.lzo 的文件。把这个文件拷贝到HDFS中。

1.2 lzo的安装测试

1.2.1 lzo安装环境准备

要在Hadoop集群中每个节点里安装lzolzop 。安装的细节不在本文档中进行叙述。但是我这里讲解下安装过程。安装lzo和lzop步骤如下:

在hadoop集群每个节点上安装lzo和lzop及其依赖(主要为解决安装lzop)[root@hadoop01 ~]# yum -y install *lzo*    (仅linux使用即可,和hadoop集群并无太大关系)

在这里插入图片描述
在这里插入图片描述

1.2.2 lzo源码编译安装

源码编译安装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

1.2.3 hadoop-lzo源码编译安装

编译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并修改版本号:
<hadoop.current.version>2.7.1</hadoop.current.version>

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 

1.2.4 hadoop集群配置修改

在core-stie.xml中配置如下,并且同步到每台服务器:
#追加如下内容
<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</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

分发到每台服务器:
[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

1.2.5 创建hive表测试lzo

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目录即可。

1.2.6 hive表加载lzo数据

/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.2.7 lzo的索引文件

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文件本身需要开销。

1.2.8 修改索引文件后查询测试

select id,firstname from lzo_test limit 3;

1.2.9 更新表输入为lzo格式

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压缩后的,否则查询出来是空或者是报错数据格式不识别。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章