【轉自】http://my.oschina.net/u/1169079/blog/225070
經常用於處理大量的數據,如果期間的輸出數據、中間數據能壓縮存儲,對系統的I/O性能會有提升。綜合考慮壓縮、解壓速度、是否支持split,目前lzo是最好的選擇。LZO(LZO是Lempel-Ziv-Oberhumer的縮寫)是一種高壓縮比和解壓速度極快的編碼,它的特點是解壓縮速度非常快,無損壓縮,壓縮后的數據能准確還原,lzo是基於block分塊的,允許數據被分解成chunk,能夠被並行的解壓。LZO庫實現了許多有下述特點的算法:
(1)、解壓簡單,速度非常快。
(2)、解壓不需要內存。
(3)、壓縮相當地快。
(4)、壓縮需要64 kB的內存。
(5)、允許在壓縮部分以損失壓縮速度為代價提高壓縮率,解壓速度不會降低。
(6)、包括生成預先壓縮數據的壓縮級別,這樣可以得到相當有競爭力的壓縮比。
(7)、另外還有一個只需要8 kB內存的壓縮級別。
(8)、算法是線程安全的。
(9)、算法是無損的。
本文針對Hadoop 2.2.0,介紹如何安裝和使用lzo。
一、下載、解壓並編譯lzo包
1 |
[wyp@master ~]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz |
2 |
[wyp@master ~]$ tar -zxvf lzo-2.06.tar.gz |
3 |
[wyp@master ~]$ cd lzo-2.06 |
4 |
[wyp@master ~]$ export CFLAGS=-m64 |
5 |
[wyp@master ~]$ ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/ |
6 |
[wyp@master ~]$ make && sudo make install |
編譯完lzo包之后,會在/usr/local/hadoop/lzo/生成一些文件,目錄結構如下:
1 |
[wyp@master /usr/local/hadoop/lzo]$ ls -l |
2 |
total 12 |
3 |
drwxr-xr-x 3 root root 4096 Mar 21 17:23 include |
4 |
drwxr-xr-x 2 root root 4096 Mar 21 17:23 lib |
5 |
drwxr-xr-x 3 root root 4096 Mar 21 17:23 share |
將/usr/local/hadoop/lzo目錄下的所有文件打包,並同步到集群中的所有機器上。
1 |
[wyp@master ~]$ yum -y install lzo-devel \ |
2 |
zlib-devel gcc autoconf automake libtool |
二、安裝Hadoop-LZO
這里下載的是Twitter hadoop-lzo,可以用Maven(如何安裝Maven請參照本博客的《Linux命令行下安裝Maven與配置》)進行編譯。
1 |
[wyp@master ~]$ wget https://github.com/twitter/hadoop-lzo/archive/master.zip |
下載后的文件名是master,它是一個zip格式的壓縮包,可以進行解壓:
1 |
[wyp@master ~]$ unzip master |
解壓后的文件夾名為hadoop-lzo-master
1 |
[wyp@master ~]$ git clone https://github.com/twitter/hadoop-lzo.git |
hadoop-lzo中的pom.xml依賴了hadoop2.1.0-beta,由於我們這里用到的是Hadoop 2.2.0,所以建議將hadoop版本修改為2.2.0:
1 |
<properties> |
2 |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
3 |
<hadoop.current.version>2.2.0</hadoop.current.version> |
4 |
<hadoop.old.version>1.0.4</hadoop.old.version> |
5 |
</properties> |
然后進入hadoop-lzo-master目錄,依次執行下面的命令
01 |
[wyp@master hadoop-lzo-master]$ export CFLAGS=-m64 |
02 |
[wyp@master hadoop-lzo-master]$ export CXXFLAGS=-m64 |
03 |
[wyp@master hadoop-lzo-master]$ export C_INCLUDE_PATH= \ |
04 |
/usr/local/hadoop/lzo/include |
05 |
[wyp@master hadoop-lzo-master]$ export LIBRARY_PATH=/usr/local/hadoop/lzo/lib |
06 |
[wyp@master hadoop-lzo-master]$ mvn clean package -Dmaven.test.skip=true |
07 |
[wyp@master hadoop-lzo-master]$ cd target/native/Linux-amd64-64 |
08 |
[wyp@master Linux-amd64-64]$ tar -cBf - -C lib . | tar -xBvf - -C ~ |
09 |
[wyp@master ~]$cp ~/libgplcompression* $HADOOP_HOME/lib/native/ |
10 |
[wyp@master hadoop-lzo-master]$cp target/hadoop-lzo-0.4.18-SNAPSHOT.jar \ |
11 |
$HADOOP_HOME/share/hadoop/common/ |
其實在tar -cBf – -C lib . | tar -xBvf – -C ~命令之后,會在~目錄下生成一下幾個文件:
1 |
[wyp@master ~]$ ls -l |
2 |
-rw-r--r-- 1 libgplcompression.a |
3 |
-rw-r--r-- 1 libgplcompression.la |
4 |
lrwxrwxrwx 1 libgplcompression.so -> libgplcompression.so.0.0.0 |
5 |
lrwxrwxrwx 1 libgplcompression.so.0 -> libgplcompression.so.0.0.0 |
6 |
-rwxr-xr-x 1 libgplcompression.so.0.0.0 |
其中libgplcompression.so和libgplcompression.so.0是鏈接文件,指向libgplcompression.so.0.0.0,將剛剛生成的libgplcompression*和target/hadoop-lzo-0.4.18-SNAPSHOT.jar同步到集群中的所有機器對應的目錄。
三、配置Hadoop環境變量
1、在Hadoop中的$HADOOP_HOME/etc/hadoop/hadoop-env.sh加上下面配置:
1 |
export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib |
2、在$HADOOP_HOME/etc/hadoop/core-site.xml加上如下配置:
01 |
<property> |
02 |
<name>io.compression.codecs</name> |
03 |
<value>org.apache.hadoop.io.compress.GzipCodec, |
04 |
org.apache.hadoop.io.compress.DefaultCodec, |
05 |
com.hadoop.compression.lzo.LzoCodec, |
06 |
com.hadoop.compression.lzo.LzopCodec, |
07 |
org.apache.hadoop.io.compress.BZip2Codec |
08 |
</value> |
09 |
</property> |
10 |
11 |
<property> |
12 |
<name>io.compression.codec.lzo.class</name> |
13 |
<value>com.hadoop.compression.lzo.LzoCodec</value> |
14 |
</property> |
3、在$HADOOP_HOME/etc/hadoop/mapred-site.xml加上如下配置
01 |
<property> |
02 |
<name>mapred.compress.map.output</name> |
03 |
<value>true</value> |
04 |
</property> |
05 |
06 |
<property> |
07 |
<name>mapred.map.output.compression.codec</name> |
08 |
<value>com.hadoop.compression.lzo.LzoCodec</value> |
09 |
</property> |
10 |
11 |
<property> |
12 |
<name>mapred.child.env</name> |
13 |
<value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value> |
14 |
</property> |
將剛剛修改的配置文件全部同步到集群的所有機器上,並重啟Hadoop集群,這樣就可以在Hadoop中使用lzo。
四、如何使用
這里在Hive中使用一下lzo,在hive中創建一個lzo表:
1 |
hive> create table lzo( |
2 |
> id int, |
3 |
> name string) |
4 |
> STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' |
5 |
> OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; |
6 |
OK |
7 |
Time taken: 3.423 seconds |
1 |
FAILED: Error in metadata: Class not found: \ |
2 |
com.hadoop.mapred.DeprecatedLzoTextInputFormat |
3 |
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask |
請檢查你的環境是否配置好。
然后在本地用lzo壓縮一個文件,先看看users.txt的內容:
01 |
[wyp@master ~]$ cat users.txt |
02 |
1^Awyp |
03 |
2^Azs |
04 |
3^Als |
05 |
4^Aww |
06 |
5^Awyp2 |
07 |
6^Awyp3 |
08 |
7^Awyp4 |
09 |
8^Awyp5 |
10 |
9^Awyp6 |
11 |
10^Awyp7 |
12 |
11^Awyp8 |
13 |
12^Awyp5 |
14 |
13^Awyp9 |
15 |
14^Awyp20 |
16 |
[wyp@master ~]$ lzop users.txt |
17 |
[wyp@master ~]$ ls -l users.txt* |
18 |
-rw-r--r-- 1 wyp wyp 97 Mar 25 15:40 users.txt |
19 |
-rw-r--r-- 1 wyp wyp 154 Mar 25 15:40 users.txt.lzo |
將users.txt.lzo的數據導入到lzo表里面:
01 |
hive> load data local inpath '/home/wyp/users.txt.lzo' into table lzo; |
02 |
Copying data from file:/home/wyp/users.txt.lzo |
03 |
Copying file: file:/home/wyp/users.txt.lzo |
04 |
Loading data to table default.lzo |
05 |
Table default.lzo stats: [num_partitions: 0, num_files: 1, |
06 |
num_rows: 0, total_size: 154, raw_data_size: 0] |
07 |
OK |
08 |
Time taken: 0.49 seconds |
09 |
hive> select * from lzo; |
10 |
OK |
11 |
1 wyp |
12 |
2 zs |
13 |
3 ls |
14 |
4 ww |
15 |
5 wyp2 |
16 |
6 wyp3 |
17 |
7 wyp4 |
18 |
8 wyp5 |
19 |
9 wyp6 |
20 |
10 wyp7 |
21 |
11 wyp8 |
22 |
12 wyp5 |
23 |
13 wyp9 |
24 |
14 wyp20 |
25 |
Time taken: 0.244 seconds, Fetched: 14 row(s) |
好了,我們可以在Hadoop中使用lzo了!!(完)
