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