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壓縮後的,否則查詢出來是空或者是報錯數據格式不識別。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章