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集羣中每個節點裏安裝lzo
和lzop
。安裝的細節不在本文檔中進行敘述。但是我這裏講解下安裝過程。安裝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壓縮後的,否則查詢出來是空或者是報錯數據格式不識別。