Hadoop 2.2.0安裝和配置lzo

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
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/生成一些文件,目錄結構以下:git

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目錄下的全部文件打包,並同步到集羣中的全部機器上。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

1 [wyp@master ~]$ unzip master

解壓後的文件夾名爲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

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目錄,依次執行下面的命令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 ~命令以後,會在~目錄下生成一下幾個文件:性能

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同步到集羣中的全部機器對應的目錄。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加上以下配置:

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>

  三、在$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。

4、如何使用

  這裏在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
若是在建立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的內容:

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了!!(完)

相關文章
相關標籤/搜索