在 《Hadoop 2.2.0安裝和配置lzo》 文章中介紹瞭如何基於 Hadoop 2.2.0安裝lzo。裏面簡單介紹了若是在Hive裏面使用lzo數據。今天主要來講說如何在Hadoop 2.2.0中使用lzo壓縮文件看成的數據。
lzo壓縮默認的是不支持切分的,也就是說,若是直接把lzo文件看成Mapreduce任務的輸入,那麼Mapreduce只會用一個Map來處理這個輸入文件,這顯然不是咱們想要的。其實咱們只須要對lzo文件創建索引,這樣這個lzo文件就會支持切分,也就能夠用多個Map來處理lzo文件。咱們能夠用 《Hadoop 2.2.0安裝和配置lzo》 文章中編譯的hadoop-lzo-0.4.20-SNAPSHOT.jar包來對lzo文件創建索引(假如在/home/wyp/input目錄下有個cite.txt.lzo文件,這個目錄是在HDFS上):java
1 |
$ $HADOOP_HOMOE/bin/hadoop jar |
2 |
$HADOOP_HOMOE/share/hadoop/common/hadoop-lzo- 0.4 . 20 -SNAPSHOT.jar |
3 |
com.hadoop.compression.lzo.DistributedLzoIndexer |
4 |
/home/wyp/input/cite.txt.lzo |
生成出來的索引文件後綴爲.index,並存放在lzo同一目錄下.在本例中產生的索引文件是存放在/home/wyp/input目錄下,名稱爲cite.txt.lzo.index。apache
咱們也能夠用下面的方法對lzo文件來創建索引:
1 |
$ $HADOOP_HOMOE/bin/hadoop jar |
2 |
$HADOOP_HOMOE/share/hadoop/common/hadoop-lzo- 0.4 . 20 -SNAPSHOT.jar |
3 |
com.hadoop.compression.lzo.LzoIndexer |
4 |
/home/wyp/input/cite.txt.lzo |
這個方法和上面方法產生出來的索引文件是同樣的;可是上面的方法是經過啓用Mapreduce任務來執行的,而這裏的方法只在一臺客戶機上運行,效率很慢!app
那麼,如何在Mapreduce任務中使用lzo文件。下面分別對Mapreduce程序、Streaming程序以及Hive分別進行說明:oop
一、對於Mapreduce程序,咱們須要把程序中全部的TextInputFormat修改成LzoTextInputFormat,以下:
1 |
job.setInputFormatClass(TextInputFormat. class ); |
5 |
job.setInputFormatClass(LzoTextInputFormat. class ); |
LzoTextInputFormat類須要引入相應的包,若是你是使用pom文件,能夠引入如下依賴:spa
2 |
<groupId>com.hadoop.gplcompression</groupId> |
3 |
<artifactId>hadoop-lzo</artifactId> |
4 |
<version> 0.4 . 19 </version> |
若是你的輸入格式不是LzoTextInputFormat類,那麼Mapreduce程序將會把.index文件也看成是數據文件!修改完以後,須要從新編譯你的Mapreduc程序。這樣在運行Mapreduce程序的時候,將lzo文件所在的目錄看成輸入便可,Mapreduce程序會識別出.index文件的:code
1 |
$ /home/q/hadoop- 2.2 . 0 /bin/hadoop jar |
2 |
statistics2.jar com.wyp.Sts |
3 |
-Dmapreduce.job.queuename=queue1 |
二、對於Streaming程序來講,能夠經過-inputformat指定輸入的文件格式,使用以下:
2 |
$HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming- 2.2 . 0 .jar |
3 |
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat |
5 |
-output /home/wyp/results |
對應Streaming做業還須要注意的是,使用DeprecatedLzoTextInputFormat輸入格式,會把文本的行號看成key傳送到reduce的,因此咱們須要將行號去掉,能夠用下面方法實現:
2 |
$HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming- 2.2 . 0 .jar |
3 |
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat |
5 |
-D stream.map.input.ignoreKey= true |
6 |
-output /home/wyp/results |
三、對於Hive,須要在建表的時候注意,以下:
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 |
注意4,5行代碼。這樣就可使用lzo文件了,並支持分割。orm