Hadoop常常用於處理大量的數據,若是期間的輸出數據、中間數據能壓縮存儲,對系統的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。java
1、下載、解壓並編譯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 |
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/生成一些文件,目錄結構以下:git
1 |
[wyp @master /usr/local/hadoop/lzo]$ ls -l |
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目錄下的全部文件打包,並同步到集羣中的全部機器上。github
在編譯lzo包的時候,須要一些環境,能夠用下面的命令安裝好lzo編譯環境
1 |
[wyp @master ~]$ yum -y install lzo-devel \ |
2 |
zlib-devel gcc autoconf automake libtool |
2、安裝Hadoop-LZO
這裏下載的是Twitter hadoop-lzo,能夠用Maven(如何安裝Maven請參照本博客的《Linux命令行下安裝Maven與配置》)進行編譯。算法
1 |
[wyp @master ~]$ wget https: //github.com/twitter/hadoop-lzo/archive/master.zip |
下載後的文件名是master,它是一個zip格式的壓縮包,能夠進行解壓:apache
解壓後的文件夾名爲hadoop-lzo-master安全
固然,若是你電腦安裝了git,你也能夠用下面的命令去下載
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:maven
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> |
而後進入hadoop-lzo-master目錄,依次執行下面的命令oop
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 ~命令以後,會在~目錄下生成一下幾個文件:性能
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同步到集羣中的全部機器對應的目錄。ui
3、配置Hadoop環境變量
一、在Hadoop中的$HADOOP_HOME/etc/hadoop/hadoop-env.sh加上下面配置:
1 |
export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib |
二、在$HADOOP_HOME/etc/hadoop/core-site.xml加上以下配置:
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 |
12 |
<name>io.compression.codec.lzo. class </name> |
13 |
<value>com.hadoop.compression.lzo.LzoCodec</value> |
三、在$HADOOP_HOME/etc/hadoop/mapred-site.xml加上以下配置
02 |
<name>mapred.compress.map.output</name> |
07 |
<name>mapred.map.output.compression.codec</name> |
08 |
<value>com.hadoop.compression.lzo.LzoCodec</value> |
12 |
<name>mapred.child.env</name> |
13 |
<value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value> |
將剛剛修改的配置文件所有同步到集羣的全部機器上,並重啓Hadoop集羣,這樣就能夠在Hadoop中使用lzo。
4、如何使用
這裏在Hive中使用一下lzo,在hive中建立一個lzo表:
1 |
hive> create table lzo( |
4 |
> STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' |
5 |
> OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' ; |
7 |
Time taken: 3.423 seconds |
若是在建立lzo表出現了以下錯誤:
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的內容:
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 ] |
08 |
Time taken: 0.49 seconds |
09 |
hive> select * from lzo; |
25 |
Time taken: 0.244 seconds, Fetched: 14 row(s) |
好了,咱們能夠在Hadoop中使用lzo了!!(完)