技术分享:hive LZO压缩

本文环境介绍:

软件版本备注centos6.5hadoop2.7.12.7.*即可hive2.3.6lzo2.10需要独立安装

 

1 lzo压缩

1.1 lzo的简介

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

lzo的官方介绍:

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

技术分享:hive LZO压缩_第1张图片

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集群中每个节点里安装lzo 和lzop 。安装的细节不在本文档中进行叙述。但是我这里讲解下安装过程。安装lzo和lzop步骤如下:

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

技术分享:hive LZO压缩_第2张图片

技术分享:hive LZO压缩_第3张图片

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并修改版本号:
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 

1.2.4 hadoop集群配置修改

在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

 

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压缩后的,否则查询出来是空或者是报错数据格式不识别。

你可能感兴趣的:(技术分享:hive LZO压缩)